excelize
excelize copied to clipboard
Add new langNumFmtFunc in `numfmt`
PR Details
Support for more built-in langNumFmt allows GetCellValue
to fetch dates and times in more localizations
Description
Related Issue
#1885
Motivation and Context
When I using the following code, I found that the current CultureInfo
type only supports CultureNameZhCN
and CultureNameEnUS
, which makes it impossible for me to obtain the time and date formats of other regions through the GetCellValue
method.
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
)
func main() {
f := excelize.NewFile(excelize.Options{
CultureInfo: excelize.CultureNameZhCN, // or excelize.CultureNameEnUS
})
style1, err := f.NewStyle(&excelize.Style{
NumFmt: 27,
})
if err != nil {
fmt.Println(err)
return
}
f.SetCellStyle("Sheet1", "A2", "A2", style1)
f.SetCellValue("Sheet1", "A2", 45405)
date, err := f.GetCellValue("Sheet1", "A2")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(date)
if err := f.SaveAs("./Book1.xlsx"); err != nil {
fmt.Println(err)
}
}
How Has This Been Tested
Add Unit Test
Types of changes
- [ ] Docs change / refactoring / dependency upgrade
- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
Checklist
- [x] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [x] I have read the CONTRIBUTING document.
- [ ] I have added tests to cover my changes.
- [ ] All new and existing tests passed.
Thanks for your PR. Could you add unit test for this changes?
No problem, it was my oversight, I'll add unit tests for these changes
- The results of parsing expressions with "e" in Excel and Exelize are different: demo:
func main() {
f := excelize.NewFile()
numfmt1 := "e\"年\"m\"月\"d\"日\""
style1, err := f.NewStyle(&excelize.Style{
CustomNumFmt: &numfmt1,
})
if err != nil {
fmt.Println(err)
return
}
f.SetCellStyle("Sheet1", "A2", "A2", style1)
f.SetCellValue("Sheet1", "A2", 45050)
cellValue1, _ := f.GetCellValue("Sheet1", "A2")
fmt.Printf("1:%v\n", cellValue1)
numfmt2 := "yyyy\"年\"m\"月\"d\"日\""
style2, err := f.NewStyle(&excelize.Style{
CustomNumFmt: &numfmt2,
})
if err != nil {
fmt.Println(err)
return
}
f.SetCellStyle("Sheet1", "B2", "B2", style2)
f.SetCellValue("Sheet1", "B2", 45050)
cellValue2, _ := f.GetCellValue("Sheet1", "B2")
fmt.Printf("2:%v\n", cellValue2)
numfmt3 := "[$-411]ggge\"年\"m\"月\"d\"日\""
style3, err := f.NewStyle(&excelize.Style{
CustomNumFmt: &numfmt3,
})
if err != nil {
fmt.Println(err)
return
}
f.SetCellStyle("Sheet1", "C2", "C2", style3)
f.SetCellValue("Sheet1", "C2", 45050)
cellValue3, _ := f.GetCellValue("Sheet1", "C2")
fmt.Printf("3:%v\n", cellValue3)
if err := f.SaveAs("demo/Book1.xlsx"); err != nil {
fmt.Println(err)
}
}
Results in Excel:
Results in Exelize:
- Not supported for Thai language parsing
demo:
func main() {
f := excelize.NewFile()
numfmt4 := "ว-ดดด-ปป"
style4, err := f.NewStyle(&excelize.Style{
CustomNumFmt: &numfmt4,
})
if err != nil {
fmt.Println(err)
return
}
f.SetCellStyle("Sheet1", "D2", "D2", style4)
f.SetCellValue("Sheet1", "D2", 45050)
cellValue4, _ := f.GetCellValue("Sheet1", "D2")
fmt.Printf("4:%v\n", cellValue4)
if err := f.SaveAs("demo/Book1.xlsx"); err != nil {
fmt.Println(err)
}
Results in Excel:
Results in Exelize:
These problems are leading to the failure of the "zh-tw" and "th-th" related tests, and if you are agreeable, I can provide the code for the "ja-jp" and "ko-kr" parts first, and within the getBuiltInNumFmtCode function, I can set a TODO comment. Both "ja-jp" part and ko-kr" part have passed the tests successfully.
Good job. I think we need to resolve this number format code parse or evaluate the issue before merging this. Maybe it will be related to the NFP library, I'm not sure.
Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:
Project coverage is 99.32%. Comparing base (
f1d1a5d
) to head (0f343c0
). Report is 1 commits behind head on master.
Additional details and impacted files
@@ Coverage Diff @@
## master #1895 +/- ##
=======================================
Coverage 99.32% 99.32%
=======================================
Files 32 32
Lines 25374 25459 +85
=======================================
+ Hits 25202 25287 +85
Misses 92 92
Partials 80 80
Flag | Coverage Δ | |
---|---|---|
unittests | 99.32% <100.00%> (+<0.01%) |
:arrow_up: |
Flags with carried forward coverage won't be shown. Click here to find out more.
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.