Giter Club home page Giter Club logo

Comments (2)

xxxcoffee avatar xxxcoffee commented on July 19, 2024 1

I encountered an issue while working with Excel files. Specifically, when I read a Date type cell (including its style), modify some values, and then write it to another Excel file using SetCellStr and SetCellStyle, the date cell in the new Excel file appears as a number. However, the cell value remains a string. If I attempt to edit the cell, its value changes to a number reflecting an Excel date day.

During debugging, I observed that the GetCellStyle function calls the extractNumFmt function to read the NumFmt from Excel, and the xf.NumFmtID property has the correct value for CustomNumFmt (like 178 for yyyy/mmmm etc.).

The problem seems to occur because the range s.NumFmts.NumFmt does not correctly find the appropriate NumFmt for style.NumFmt, leading to the value error.

To resolve this, I added a piece of code to stop the loop when it finds the correct NumFmtID. This adjustment corrected the issue for various formats, such as currency, date, and precision.

Here’s the modified code:

func (f *File) extractNumFmt(xf xlsxXf, s *xlsxStyleSheet, style *Style) {
    if xf.NumFmtID != nil {
        numFmtID := *xf.NumFmtID
        if _, ok := builtInNumFmt[numFmtID]; ok || isLangNumFmt(numFmtID) {
            style.NumFmt = numFmtID
            return
        }
        if s.NumFmts != nil {
            for _, numFmt := range s.NumFmts.NumFmt {

                // HERE IS THE CODE!!! LOOK AT ME! LOOK AT ME!
                if numFmt.NumFmtID == numFmtID {
                    style.NumFmt = numFmtID
                    style.CustomNumFmt = &numFmt.FormatCode
                    break
                }
                // HERE IS THE CODE!!! LOOK AT ME! LOOK AT ME!

                style.CustomNumFmt = &numFmt.FormatCode
                if strings.Contains(numFmt.FormatCode, ";[Red]") {
                    style.NegRed = true
                }
                for numFmtID, fmtCode := range currencyNumFmt {
                    if style.NegRed {
                        fmtCode += ";[Red]" + fmtCode
                    }
                    if numFmt.FormatCode == fmtCode {
                        style.NumFmt = numFmtID
                    }
                }
            }
        }
    }
}

By the way, my version is v2.8.0

from excelize.

xxxcoffee avatar xxxcoffee commented on July 19, 2024 1

Ha, you fix it. thanks

from excelize.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.