github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/encoding/kmgExcel/XlsxWriter.go (about)

     1  package kmgExcel
     2  
     3  import (
     4  	"archive/zip"
     5  	"bytes"
     6  	"encoding/xml"
     7  	"fmt"
     8  	"io"
     9  	"os"
    10  	"strconv"
    11  	"text/template"
    12  )
    13  
    14  func Array2XlsxByte(data [][]string) (b []byte, err error) {
    15  	fileBuf := &bytes.Buffer{}
    16  	err = Array2XlsxIo(data, fileBuf)
    17  	if err != nil {
    18  		return nil, err
    19  	}
    20  	return fileBuf.Bytes(), nil
    21  }
    22  
    23  //write raw data into xlsx file
    24  //data key means: rowIndex,columnIndex,value
    25  func Array2XlsxFile(data [][]string, path string) (err error) {
    26  	f, err := os.Create(path)
    27  	if err != nil {
    28  		return
    29  	}
    30  	defer f.Close()
    31  	err = Array2XlsxIo(data, f)
    32  	if err != nil {
    33  		return
    34  	}
    35  	return
    36  }
    37  
    38  //write raw data into a io.Writer
    39  //data key means: rowIndex,columnIndex,value
    40  //Array2XlsxIo can be used to write xlsx file in memory without touch filesystem.
    41  func Array2XlsxIo(data [][]string, w io.Writer) (err error) {
    42  	zw := zip.NewWriter(w)
    43  	defer zw.Close()
    44  
    45  	// sharedStrings
    46  	err = array2XlsxWriteSharedStrings(zw, data)
    47  	if err != nil {
    48  		return
    49  	}
    50  	// sheel1
    51  	err = array2XlsxWriteSheet1(zw, data)
    52  	if err != nil {
    53  		return
    54  	}
    55  
    56  	for filename, content := range fixedFileContent {
    57  		thisW, err := zw.Create(filename)
    58  		if err != nil {
    59  			return err
    60  		}
    61  		_, err = thisW.Write(content)
    62  		if err != nil {
    63  			return err
    64  		}
    65  	}
    66  
    67  	return
    68  }
    69  func array2XlsxWriteSharedStrings(zw *zip.Writer, data [][]string) (err error) {
    70  	siList := []xlsxSharedStringSi{{""}}
    71  	for _, row := range data {
    72  		for _, v1 := range row {
    73  			if v1 == "" { //ignore blank cell can save space
    74  				continue
    75  			}
    76  			siList = append(siList, xlsxSharedStringSi{v1})
    77  		}
    78  	}
    79  	sst := xlsxSharedStringSst{
    80  		Xmlns:  xmlNs,
    81  		Count:  len(siList),
    82  		SiList: siList,
    83  	}
    84  	thisW, err := zw.Create(sharedStringsFileName)
    85  	_, err = thisW.Write([]byte(xml.Header))
    86  	if err != nil {
    87  		return
    88  	}
    89  	encoder := xml.NewEncoder(thisW)
    90  	err = encoder.Encode(sst)
    91  	if err != nil {
    92  		return
    93  	}
    94  	return
    95  }
    96  
    97  func array2XlsxWriteSheet1(zw *zip.Writer, data [][]string) (err error) {
    98  	rowList := make([]xlsxRow, len(data))
    99  	totalIndex := 1
   100  	MaxCellIndex := 0
   101  	for rowIndex, row := range data {
   102  		rowList[rowIndex].C = make([]xlsxC, len(row))
   103  		if len(row) > MaxCellIndex {
   104  			MaxCellIndex = len(row) - 1
   105  		}
   106  		for cellIndex, v1 := range row {
   107  			index := totalIndex
   108  			if v1 == "" { //ignore blank cell can save space
   109  				index = 0
   110  			} else {
   111  				totalIndex++
   112  			}
   113  			rowList[rowIndex].C[cellIndex] = xlsxC{
   114  				R: CoordinateXy2Excel(cellIndex, rowIndex),
   115  				T: "s",
   116  				V: index,
   117  			}
   118  		}
   119  	}
   120  	sheetData := xlsxSheetData{
   121  		Row: rowList,
   122  	}
   123  	thisW, err := zw.Create(sheel1FileName)
   124  	xmlBytes, err := xml.Marshal(sheetData)
   125  	if err != nil {
   126  		return
   127  	}
   128  	err = sheelTpl.Execute(thisW, struct {
   129  		MaxPosition string
   130  		SheetData   string
   131  	}{
   132  		MaxPosition: CoordinateXy2Excel(MaxCellIndex, len(data)-1),
   133  		SheetData:   string(xmlBytes),
   134  	})
   135  	if err != nil {
   136  		return
   137  	}
   138  	return
   139  }
   140  
   141  //坐标系变换,从xy坐标系变化成excel的字符坐标系
   142  //xy坐标从(0,0)开始,excel坐标从A1开始
   143  func CoordinateXy2Excel(collomnIndex int, rowIndex int) (output string) {
   144  	if collomnIndex < 0 || rowIndex < 0 {
   145  		panic(fmt.Errorf("[CoordinateXy2Excel] collomnIndex[%d]<0||y[%d]<0", collomnIndex, rowIndex))
   146  	}
   147  	for {
   148  		output = string(collomnIndex%26+int('A')) + output
   149  		collomnIndex = collomnIndex/26 - 1
   150  		if collomnIndex < 0 {
   151  			break
   152  		}
   153  	}
   154  	/*
   155  		for reference,通过下面的代码推导出上面的循环代码
   156  		if ((x/26-1)/26-1)>=0{
   157  		    output+=string((x/26-1)/26-1+int('A'))+string((x/26-1)%26+int('A'))+string(x%26+int('A'))
   158  		}else if (x/26-1)>=0{
   159  			output+=string(x/26-1+int('A'))+string(x%26+int('A'))
   160  		}else{
   161  			output+=string(x+int('A'))
   162  		}
   163  	*/
   164  	output += strconv.Itoa(rowIndex + 1)
   165  	return output
   166  }
   167  
   168  //file content from wps xlsx file.
   169  var fixedFileContent = map[string][]byte{
   170  	"[Content_Types].xml": []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
   171  <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/><Default ContentType="application/xml" Extension="xml"/><Override ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml" PartName="/docProps/app.xml"/><Override ContentType="application/vnd.openxmlformats-package.core-properties+xml" PartName="/docProps/core.xml"/><Override ContentType="application/vnd.openxmlformats-officedocument.custom-properties+xml" PartName="/docProps/custom.xml"/><Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" PartName="/xl/sharedStrings.xml"/><Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" PartName="/xl/styles.xml"/><Override ContentType="application/vnd.openxmlformats-officedocument.theme+xml" PartName="/xl/theme/theme1.xml"/><Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" PartName="/xl/workbook.xml"/><Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" PartName="/xl/worksheets/sheet1.xml"/></Types>`),
   172  	"_rels/.rels": []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   173  <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties" Target="docProps/custom.xml"/></Relationships>`),
   174  	"docProps/app.xml": []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   175  <Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><Application>WPS Office 个人版</Application><HeadingPairs><vt:vector size="2" baseType="variant"><vt:variant><vt:lpstr>工作表</vt:lpstr></vt:variant><vt:variant><vt:i4>1</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size="1" baseType="lpstr"><vt:lpstr>1</vt:lpstr></vt:vector></TitlesOfParts></Properties>`),
   176  	"docProps/core.xml": []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   177  <cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:creator>Administrator</dc:creator><dcterms:created xsi:type="dcterms:W3CDTF">2014-04-01T19:29:42Z</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">2014-04-01T19:29:50Z</dcterms:modified></cp:coreProperties>`),
   178  	"docProps/custom.xml": []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   179  <Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="KSOProductBuildVer"><vt:lpwstr>2052-9.1.0.4468</vt:lpwstr></property></Properties>`),
   180  	"xl/_rels/workbook.xml.rels": []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   181  <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/></Relationships>`),
   182  	"xl/theme/theme1.xml": []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   183  <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office 主题​​"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Deva" typeface="Mangal"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Geor" typeface="Sylfaen"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Guru" typeface="Raavi"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Taml" typeface="Latha"/><a:font script="Telu" typeface="Gautami"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Arab" typeface="Arial"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Deva" typeface="Mangal"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Geor" typeface="Sylfaen"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Guru" typeface="Raavi"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Hebr" typeface="Arial"/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Taml" typeface="Latha"/><a:font script="Telu" typeface="Gautami"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Viet" typeface="Arial"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:satMod val="350000"/><a:shade val="99000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults><a:spDef><a:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/></a:xfrm><a:custGeom><a:avLst/><a:gdLst><a:gd name="_h" fmla="val 21600"/><a:gd name="_w" fmla="val 21600"/></a:gdLst><a:ahLst/><a:cxnLst/><a:pathLst><a:path w="21600" h="21600"/></a:pathLst></a:custGeom><a:gradFill rotWithShape="0"><a:gsLst><a:gs pos="100000"><a:srgbClr val="9CBEE0"/></a:gs><a:gs pos="0"><a:srgbClr val="BBD5F0"/></a:gs></a:gsLst><a:lin ang="5400000" scaled="0"/></a:gradFill><a:ln w="15875" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:srgbClr val="739CC3"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="200000"/></a:ln></a:spPr><a:bodyPr/><a:lstStyle/></a:spDef></a:objectDefaults><a:extraClrSchemeLst/></a:theme>`),
   184  	"xl/styles.xml": []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   185  <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><numFmts count="4"><numFmt numFmtId="43" formatCode="_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * &quot;-&quot;??_ ;_ @_ "/><numFmt numFmtId="44" formatCode="_ &quot;¥&quot;* #,##0.00_ ;_ &quot;¥&quot;* \-#,##0.00_ ;_ &quot;¥&quot;* &quot;-&quot;??_ ;_ @_ "/><numFmt numFmtId="41" formatCode="_ * #,##0_ ;_ * \-#,##0_ ;_ * &quot;-&quot;_ ;_ @_ "/><numFmt numFmtId="42" formatCode="_ &quot;¥&quot;* #,##0_ ;_ &quot;¥&quot;* \-#,##0_ ;_ &quot;¥&quot;* &quot;-&quot;_ ;_ @_ "/></numFmts><fonts count="1"><font><sz val="12"/><name val="宋体"/><charset val="134"/></font></fonts><fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills><borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders><cellStyleXfs count="6"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"><alignment vertical="center"/></xf><xf numFmtId="43" fontId="0" fillId="0" borderId="0" applyFont="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"><alignment vertical="center"/></xf><xf numFmtId="44" fontId="0" fillId="0" borderId="0" applyFont="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"><alignment vertical="center"/></xf><xf numFmtId="41" fontId="0" fillId="0" borderId="0" applyFont="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"><alignment vertical="center"/></xf><xf numFmtId="9" fontId="0" fillId="0" borderId="0" applyFont="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"><alignment vertical="center"/></xf><xf numFmtId="42" fontId="0" fillId="0" borderId="0" applyFont="0" applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0"><alignment vertical="center"/></xf></cellStyleXfs><cellXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"><alignment vertical="center"/></xf></cellXfs><cellStyles count="6"><cellStyle name="常规" xfId="0" builtinId="0"/><cellStyle name="千位分隔" xfId="1" builtinId="3"/><cellStyle name="货币" xfId="2" builtinId="4"/><cellStyle name="千位分隔[0]" xfId="3" builtinId="6"/><cellStyle name="百分比" xfId="4" builtinId="5"/><cellStyle name="货币[0]" xfId="5" builtinId="7"/></cellStyles></styleSheet>`),
   186  	"xl/workbook.xml": []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   187  <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><fileVersion appName="xl" lastEdited="3" lowestEdited="5" rupBuild="9302"/><workbookPr/><bookViews><workbookView windowWidth="13400" windowHeight="14160"/></bookViews><sheets><sheet name="1" sheetId="1" r:id="rId1"/></sheets><calcPr calcId="144525"/></workbook>`),
   188  }
   189  
   190  const sheel1FileName = "xl/worksheets/sheet1.xml"
   191  const sharedStringsFileName = "xl/sharedStrings.xml"
   192  
   193  var sheelTpl = template.Must(template.New("main").Parse(`<?xml version="1.0" encoding="UTF-8"?>
   194  <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
   195  xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
   196  xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
   197  xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"
   198  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
   199  <dimension ref="A1:{{.MaxPosition}}"/>
   200  {{.SheetData}}
   201  </worksheet>
   202  `))
   203  
   204  type xlsxSharedStringSst struct {
   205  	XMLName xml.Name             `xml:"sst"`
   206  	Xmlns   string               `xml:"xmlns,attr"`
   207  	Count   int                  `xml:"count,attr"`
   208  	SiList  []xlsxSharedStringSi `xml:"si"`
   209  }
   210  type xlsxSharedStringSi struct {
   211  	T string `xml:"t"`
   212  }
   213  type xlsxSheetData struct {
   214  	XMLName xml.Name  `xml:"sheetData"`
   215  	Row     []xlsxRow `xml:"row"`
   216  }
   217  type xlsxRow struct {
   218  	C []xlsxC `xml:"c"`
   219  }
   220  type xlsxC struct {
   221  	R string `xml:"r,attr"`
   222  	T string `xml:"t,attr"`
   223  	V int    `xml:"v"`
   224  }
   225  
   226  const xmlNs = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"
   227  
   228  /*
   229  for reference of contents of wps xlsx files which dynamically generated from this program
   230  sharedStrings.xml
   231  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   232  <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="2">
   233    <si><t>中文</t></si>
   234    <si><t>哈哈</t></si>
   235  </sst>
   236  
   237  sheet1.xml
   238  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   239  <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
   240  xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
   241  xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
   242  xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"
   243  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
   244  <dimension ref="A1:C1492"/>
   245  <sheetData>
   246  <row>
   247    <c r="A1" t="s"><v>0</v></c>
   248    <c r="B1"><v>1</v></c>
   249  </row>
   250  <row r="2">
   251    <c r="A2"><v>2</v></c>
   252    <c r="B2"><v>3</v></c>
   253    <c r="C2" t="s"><v>1</v></c>
   254  </row>
   255  </sheetData>
   256  </worksheet>
   257  */