1
0
mirror of https://github.com/pbnjay/grate.git synced 2026-05-21 02:19:04 +02:00

refactor common excel stuff

This commit is contained in:
Jeremy Jay
2021-02-11 01:28:46 -05:00
parent 8812c44704
commit b048fa8aad
5 changed files with 32 additions and 100 deletions
+14 -88
View File
@@ -1,4 +1,4 @@
package xls
package commonxl
import (
"regexp"
@@ -6,15 +6,19 @@ import (
"time"
)
func getDateTime(fno uint16, f string, val float64, mode1904 bool) (time.Time, bool) {
if !formatIsDateTime(fno, f) {
// GetDateTime is a wrapper for chained invocation of
// FormatIsDateTime and ConvertToDate.
func GetDateTime(fno uint16, f string, val float64, mode1904 bool) (time.Time, bool) {
if !FormatIsDateTime(fno, f) {
return time.Time{}, false
}
return convertToDate(val, mode1904), true
return ConvertToDate(val, mode1904), true
}
// http://web.archive.org/web/20190808062235/http://aa.usno.navy.mil/faq/docs/JD_Formula.php
func convertToDate(val float64, mode1904 bool) time.Time {
// ConvertToDate converts a floating-point value using the
// Excel date serialization conventions.
func ConvertToDate(val float64, mode1904 bool) time.Time {
// http://web.archive.org/web/20190808062235/http://aa.usno.navy.mil/faq/docs/JD_Formula.php
v := int(val)
if v < 61 {
jdate := val + 0.5
@@ -50,7 +54,9 @@ func convertToDate(val float64, mode1904 bool) time.Time {
return date.AddDate(0, 0, v).Add(t)
}
func formatIsDateTime(fno uint16, f string) bool {
// FormatIsDateTime returns true if the given format number or
// format string contains a date/time formatting instruction.
func FormatIsDateTime(fno uint16, f string) bool {
if _, ok := builtInDateFormats[fno]; ok {
return true
}
@@ -84,87 +90,7 @@ var builtInDateFormats = map[uint16]byte{
76: 2, 77: 3, 78: 2, 79: 2, 80: 2, 81: 1,
}
var builtInFormats = map[uint16]string{
0: `General`,
1: `0`,
2: `0.00`,
3: `#,##0`,
4: `#,##0.00`,
9: `0%`,
10: `0.00%`,
11: `0.00E+00`,
12: `# ?/?`,
13: `# ??/??`,
14: `mm-dd-yy`,
15: `d-mmm-yy`,
16: `d-mmm`,
17: `mmm-yy`,
18: `h:mm AM/PM`,
19: `h:mm:ss AM/PM`,
20: `h:mm`,
21: `h:mm:ss`,
22: `m/d/yy h:mm`,
37: `#,##0 ;(#,##0)`,
38: `#,##0 ;[Red](#,##0)`,
39: `#,##0.00;(#,##0.00)`,
40: `#,##0.00;[Red](#,##0.00)`,
41: `_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)`,
42: `_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)`,
43: `_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)`,
44: `_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)`,
45: `mm:ss`,
46: `[h]:mm:ss`,
47: `mmss.0`,
48: `##0.0E+0`,
49: `@`,
// zh-cn format codes
27: `yyyy"年"m"月"`,
28: `m"月"d"日"`,
29: `m"月"d"日"`,
30: `m-d-yy`,
31: `yyyy"年"m"月"d"日"`,
32: `h"时"mm"分"`,
33: `h"时"mm"分"ss"秒"`,
34: `上午/下午 h"时"mm"分"`,
35: `上午/下午 h"时"mm"分"ss"秒"`,
36: `yyyy"年"m"月"`,
50: `yyyy"年"m"月"`,
51: `m"月"d"日"`,
52: `yyyy"年"m"月"`,
53: `m"月"d"日"`,
54: `m"月"d"日"`,
55: `上午/下午 h"时"mm"分"`,
56: `上午/下午 h"时"mm"分"ss"秒`,
57: `yyyy"年"m"月"`,
58: `m"月"d"日"`,
// th-th format codes
59: `t0`,
60: `t0.00`,
61: `t#,##0`,
62: `t#,##0.00`,
67: `t0%`,
68: `t0.00%`,
69: `t# ?/?`,
70: `t# ??/??`,
// th format code, but translated to aid the parser
71: `d/m/yyyy`, // `ว/ด/ปปปป`,
72: `d-mmm-yy`, // `ว-ดดด-ปป`,
73: `d-mmm`, // `ว-ดดด`,
74: `mmm-yy`, // `ดดด-ปป`,
75: `h:mm`, // `ช:นน`,
76: `h:mm:ss`, // `ช:นน:ทท`,
77: `d/m/yyyy h:mm`, // `ว/ด/ปปปป ช:นน`,
78: `mm:ss`, // `นน:ทท`,
79: `[h]:mm:ss`, // `[ช]:นน:ทท`,
80: `mm:ss.0`, // `นน:ทท.0`,
81: `d/m/bb`, // `d/m/bb`,
}
// mapping of standard built-ins to Go date format strings.
var builtInGoFormats = map[uint16]string{
14: `01-02-06`,
15: `2-Jan-06`,
+3 -2
View File
@@ -1,6 +1,7 @@
package xlsx
package commonxl
var builtInFormats = map[uint16]string{
// BuiltInFormats are all the built-in number formats for XLS/XLSX.
var BuiltInFormats = map[uint16]string{
0: `General`,
1: `0`,
2: `0.00`,
+10 -8
View File
@@ -9,6 +9,8 @@ import (
"math"
"time"
"unicode/utf16"
"github.com/pbnjay/grate/commonxl"
)
func (b *WorkBook) Sheets() []string {
@@ -248,8 +250,8 @@ func (s *WorkSheet) parse() error {
fno := s.b.xfs[rr.IXFCell]
format := s.b.formats[fno]
if formatIsDateTime(fno, format) {
dt, ok := getDateTime(fno, format, rr.Value.Float64(), s.b.dateMode == 1)
if commonxl.FormatIsDateTime(fno, format) {
dt, ok := commonxl.GetDateTime(fno, format, rr.Value.Float64(), s.b.dateMode == 1)
if ok {
rval = dt
}
@@ -273,8 +275,8 @@ func (s *WorkSheet) parse() error {
fno := s.b.xfs[ixfe]
format := s.b.formats[fno]
if formatIsDateTime(fno, format) {
dt, ok := getDateTime(fno, format, value, s.b.dateMode == 1)
if commonxl.FormatIsDateTime(fno, format) {
dt, ok := commonxl.GetDateTime(fno, format, value, s.b.dateMode == 1)
if ok {
rval = dt
}
@@ -298,8 +300,8 @@ func (s *WorkSheet) parse() error {
fno := s.b.xfs[rr.IXFCell]
format := s.b.formats[fno]
if formatIsDateTime(fno, format) {
dt, ok := getDateTime(fno, format, rr.Value.Float64(), s.b.dateMode == 1)
if commonxl.FormatIsDateTime(fno, format) {
dt, ok := commonxl.GetDateTime(fno, format, rr.Value.Float64(), s.b.dateMode == 1)
if ok {
rval = dt
}
@@ -346,8 +348,8 @@ func (s *WorkSheet) parse() error {
fno := s.b.xfs[ixfe]
format := s.b.formats[fno]
if formatIsDateTime(fno, format) {
dt, ok := getDateTime(fno, format, value, s.b.dateMode == 1)
if commonxl.FormatIsDateTime(fno, format) {
dt, ok := commonxl.GetDateTime(fno, format, value, s.b.dateMode == 1)
if ok {
rval = dt
}
+2 -1
View File
@@ -14,6 +14,7 @@ import (
"io"
"log"
"github.com/pbnjay/grate/commonxl"
"github.com/pbnjay/grate/xls/cfb"
"github.com/pbnjay/grate/xls/crypto"
)
@@ -60,7 +61,7 @@ func Open(ctx context.Context, filename string) (*WorkBook, error) {
xfs: make([]uint16, 0, 128),
}
for no, str := range builtInFormats {
for no, str := range commonxl.BuiltInFormats {
b.formats[no] = str
}
+3 -1
View File
@@ -6,6 +6,8 @@ import (
"io"
"path/filepath"
"strconv"
"github.com/pbnjay/grate/commonxl"
)
func (d *Document) parseRels(dec *xml.Decoder, basedir string) error {
@@ -110,7 +112,7 @@ func (d *Document) parseStyles(dec *xml.Decoder) error {
}
nfid, _ := strconv.ParseInt(thisXF, 10, 16)
thisXF = builtInFormats[uint16(nfid)]
thisXF = commonxl.BuiltInFormats[uint16(nfid)]
d.xfs = append(d.xfs, thisXF)
} else {
panic("wheres is this xf??")