Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Masui Masanori
Masui Masanori

Posted on

     

[Go] Get values by excelize

Intro

In this time, I will try getting cell values from an Excel file.

Get page sizes

Because it seems there is probably no way to get the page size directly, I will try other ways.

Image description

Get a print area

If the file is set a print area, I can get it by "GetDefinedName".

xlsWriter.go

...for_,name:=rangexlFile.GetDefinedName(){log.Printf("Name: %s Refer: %s Scope: %s",name.Name,name.RefersTo,name.Scope)ifname.Name!="_xlnm.Print_Area"{continue}splittedRefs:=strings.Split(name.RefersTo,"!")// The name set for the shape does not have a sheet nameiflen(splittedRefs)>1{// $B$1:$J$53splittedAddresses:=strings.Split(splittedRefs[1],":")iflen(splittedAddresses)>1{log.Printf("From: %s To: %s",splittedAddresses[0],splittedAddresses[1])}}}...
Enter fullscreen modeExit fullscreen mode

Results

...Name: _xlnm.Print_Area Refer: 個人用月次収支!$B$1:$J$53 Scope: 個人用月 次収支From: $B$1 To: $J$53...
Enter fullscreen modeExit fullscreen mode

Get last columns and rows

xlsWriter.go

...rows,_:=xlFile.GetRows(xlFile.GetSheetName(1))log.Printf("Row: %d",len(rows))columns,_:=xlFile.GetCols(xlFile.GetSheetName(1))log.Printf("Column: %d",len(columns))...
Enter fullscreen modeExit fullscreen mode

Results

Row: 77Column: 10
Enter fullscreen modeExit fullscreen mode

Get NumFmt

I can get cell values like below.

sample.xlsm

Image description

xlsWriter.go

...targetSheet:=xlFile.GetSheetName(1)fori:=4;i<=7;i++{add:=fmt.Sprintf("D%d",i)value,_:=xlFile.GetCellValue(targetSheet,add)log.Printf("Cell Add: %s Value: %s",add,value)}...
Enter fullscreen modeExit fullscreen mode

But those results are different from the display on the Excel file.

Cell Add: D4 Value: 0.55Cell Add: D5 Value: 0Cell Add: D6 Value: 0.1Cell Add: D7 Value: 10
Enter fullscreen modeExit fullscreen mode

To match them, I should get their number format.
In excelize, I only can get their Style IDs from cells.

xlsWriter.go

...packagemainimport("bytes""fmt""log""net/http""regexp""strconv""strings""github.com/xuri/excelize/v2")funcSaveFileFromPath(filePathstring,saveFilePathstring)error{xlFile,err:=excelize.OpenFile(filePath)iferr!=nil{fmt.Println(err)returnerr}deferfunc(){// Close the spreadsheet.iferr:=xlFile.Close();err!=nil{fmt.Println(err)}}()rex:=regexp.MustCompile("[0-9]+.[0-9]+")targetSheet:=xlFile.GetSheetName(1)fori:=4;i<=7;i++{add:=fmt.Sprintf("D%d",i)value,_:=xlFile.GetCellValue(targetSheet,add)// Get format code like "0.00" if the target cell is set a number formatnumberFormatCode:=getNumberFormatCode(xlFile,targetSheet,add)log.Println(numberFormatCode)iflen(numberFormatCode)>0{// Get format text for SprintffmtText:=getFormat(numberFormatCode,rex)floatValue,_:=strconv.ParseFloat(value,64)log.Printf("Cell Add: %s Value: %s fmt: %s formatted: %s",add,value,fmtText,fmt.Sprintf(fmtText,floatValue))}else{log.Printf("Cell Add: %s Value: %s",add,value)}}...returnerr}...// Get number format codefuncgetNumberFormatCode(xlFile*excelize.File,sheetNamestring,addressstring)string{styleID,_:=xlFile.GetCellStyle(sheetName,address)// Get Number Format ID by Style IDnumFmtID:=xlFile.Styles.CellXfs.Xf[styleID].NumFmtIDfor_,numFmt:=rangexlFile.Styles.NumFmts.NumFmt{ifnumFmt.NumFmtID==*numFmtID{returnnumFmt.FormatCode}}return""}// Get number format for fmt.SprintffuncgetFormat(numFmtCodestring,rex*regexp.Regexp)string{fmtNumbers:=rex.FindString(numFmtCode)splitted:=strings.Split(fmtNumbers,".")iflen(splitted)<=1{returnfmtNumbers}result:="%.[ZERO_LENGTH]f"returnstrings.Replace(result,"[ZERO_LENGTH]",strconv.Itoa(len(splitted[1])),-1)}
Enter fullscreen modeExit fullscreen mode

Result

Cell Add: D4 Value: 0.550.00_);[Red]\(0.00\)Cell Add: D5 Value: 0 fmt: %.2f formatted: 0.000.0000Cell Add: D6 Value: 0.1 fmt: %.4f formatted: 0.10000.0Cell Add: D7 Value: 0.05 fmt: %.1f formatted: 0.1
Enter fullscreen modeExit fullscreen mode

Top comments(0)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Programmer, husband, fatherI love C#, TypeScript, Go, etc.
  • Location
    Wakayama, Japan
  • Joined

More fromMasui Masanori

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp