前一段因为数据提取的需要,需要在linux下对数据进行提取,并导出为execl格式。诚然,在linux下实现对excel文件的生成的方法很多。比较常见的就是利用perl和php语言及其扩展模块实现对excel文件的格式化操作及数据的写入、更改。不过这种现方式实现起来都比较复杂,一般都需要先安装相关的模块,再写复杂的格式化的语句,然后才是数据的操作。后来在网上查看到一篇关于利于excel的xml格式实现对excel文件的数据操作的方法。感觉很新颖,现拿来一块学习下。

1.创建一个模板excel

新建一个test.xls文件,打开自己设计样式。

2.把test.xls另存为xml表格 test.xml

3.用文本编辑器打开test.xml,我要介绍要用代码操作的地方

4.代码操作完后的结果,注意生成完后的文件的后缀必须改为.xls,这样就可以用excel直接打开了,只要有了模板excel之后,就可以在linux下把文件生成了。

5.代码,下面的代码使用时,注意:若是不是在web下使用,请把第1,2个print注释掉。使用时需要把代码保存为UTF-8格式,下面的m***cel=”ms”+”excel”,至于为什么,你懂的。

  1my $filename="test.xls";
  2@data=([12,8,98],[9,16,99],[7,4,67],[2,64,99],[3,16,67],[1,64,78]);
  3
  4$RowCount=scalar(@data)+1;
  5
  6print "Content-type: Application/m***celn";
  7print "Content-Disposition: attachment; filename='$filename'nn";
  8
  9#输出excel格式
 10
 11print <<EOFEXCELHEAD;
 12
 13<?xml version="1.0"?>
 14<?mso-application progid="Excel.Sheet"?>
 15<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 16 xmlns:o="urn:schemas-microsoft-com:office:office"
 17 xmlns:x="urn:schemas-microsoft-com:office:excel"
 18 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 19 xmlns:html="http://www.w3.org/TR/REC-html40">
 20 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
 21  <Created>1996-12-17T01:32:42Z</Created>
 22  <LastSaved>2000-11-18T06:53:49Z</LastSaved>
 23  <Version>11.9999</Version>
 24 </DocumentProperties>
 25 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
 26  <RemovePersonalInformation/>
 27 </OfficeDocumentSettings>
 28 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
 29  <WindowHeight>4530</WindowHeight>
 30  <WindowWidth>8505</WindowWidth>
 31  <WindowTopX>480</WindowTopX>
 32  <WindowTopY>120</WindowTopY>
 33  <AcceptLabelsInFormulas/>
 34  <ProtectStructure>False</ProtectStructure>
 35  <ProtectWindows>False</ProtectWindows>
 36 </ExcelWorkbook>
 37 <Styles>
 38  <Style ss:ID="Default" ss:Name="Normal">
 39   <Alignment ss:Vertical="Bottom"/>
 40   <Borders/>
 41   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
 42   <Interior/>
 43   <NumberFormat/>
 44   <Protection/>
 45  </Style>
 46  <Style ss:ID="s23">
 47   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12" ss:Color="#FFFFFF"
 48    ss:Bold="1"/>
 49   <Interior ss:Color="#000000" ss:Pattern="Solid"/>
 50  </Style>
 51  <Style ss:ID="s26">
 52   <Borders>
 53    <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
 54    <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
 55    <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
 56    <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
 57   </Borders>
 58  </Style>
 59  <Style ss:ID="s27">
 60   <Borders>
 61    <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
 62    <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
 63    <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
 64    <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
 65   </Borders>
 66   <Interior ss:Color="#CCFFCC" ss:Pattern="Solid"/>
 67  </Style>
 68 </Styles>
 69 <Worksheet ss:Name="Sheet1">
 70  <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="$RowCount" x:FullColumns="1"
 71   x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
 72   <Column ss:AutoFitWidth="0" ss:Width="99.75"/>
 73   <Column ss:AutoFitWidth="0" ss:Width="82.5"/>
 74   <Column ss:AutoFitWidth="0" ss:Width="99"/>
 75   <Row>
 76    <Cell ss:StyleID="s23"><Data ss:Type="String">响应时间(ms)</Data></Cell>
 77    <Cell ss:StyleID="s23"><Data ss:Type="String">带宽(Mbps)</Data></Cell>
 78    <Cell ss:StyleID="s23"><Data ss:Type="String">成功率(%)</Data></Cell>
 79   </Row>
 80
 81EOFEXCELHEAD
 82
 83my $i=0;
 84for$i(0..$#data){
 85
 86
 87if($i % 2 == 0){
 88print <<EOFROW
 89        <Row>
 90    <Cell ss:StyleID="s26"><Data ss:Type="Number">$data[$i][0]</Data></Cell>
 91    <Cell ss:StyleID="s26"><Data ss:Type="Number">$data[$i][1]</Data></Cell>
 92    <Cell ss:StyleID="s26"><Data ss:Type="Number">$data[$i][2]</Data></Cell>
 93   </Row>
 94
 95EOFROW
 96
 97    }else{
 98print <<EOFROW
 99        <Row>
100    <Cell ss:StyleID="s27"><Data ss:Type="Number">$data[$i][0]</Data></Cell>
101    <Cell ss:StyleID="s27"><Data ss:Type="Number">$data[$i][1]</Data></Cell>
102    <Cell ss:StyleID="s27"><Data ss:Type="Number">$data[$i][2]</Data></Cell>
103   </Row>
104
105EOFROW
106
107    }
108}
109
110print <<EOFEXCELTAIL;
111</Table>
112  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
113   <Print>
114    <ValidPrinterInfo/>
115    <PaperSizeIndex>9</PaperSizeIndex>
116    <HorizontalResolution>300</HorizontalResolution>
117    <VerticalResolution>300</VerticalResolution>
118   </Print>
119   <Selected/>
120   <Panes>
121    <Pane>
122     <Number>3</Number>
123     <ActiveRow>1</ActiveRow>
124    </Pane>
125   </Panes>
126   <ProtectObjects>False</ProtectObjects>
127   <ProtectScenarios>False</ProtectScenarios>
128  </WorksheetOptions>
129 </Worksheet>
130</Workbook>
131
132EOFEXCELTAIL

当然上面后一部分提供的对代码的操作是基于perl实现的,个人认为。其是作者帮我们提供了一种新颖的实现方法,利于xml文件导出并且形成格式后。后面的数据部分的操作就是对xml文件的修改罢了。这时候通过shell、perl、php、c、java、vb、甚至是bat批处理任意方式去处理后面的数据都无所谓了。

最后,懒一点,具体perl下对excel下的操作不再写了,给几个参照资源看下吧!

perl平台下exel的模块:http://search.cpan.org/search?m=all&q=excel&s=1

CPAN提供的Spreadsheet::WriteExcel操作的说明:http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel-2.37/

perl下对excel操作的示例:http://liang573728.itpub.net/post/37715/485310

perl连结数据库对excel操作的示例:http://liang573728.itpub.net/post/37715/511396

感觉提供新颖思路的那位仁兄,其原文为:http://blog.chinaunix.net/uid-11121450-id-193355.html