对于excel支持的csv和xls格式的报表,一直以为xls生成较难一些,因为csv只是多行以","分割的文本文件,被excel读取之后可以显示于电子表格内,但是支持的效果不好,比如不能固定表格的宽高,不能设置单元格背景,不能设置复杂的表格样式,不能添加各种运算函数,不能设置打印区域,只能显示,充其量是个数据文件.
php生成csv很简单,但是对于生成可以完成很多功能的xls格式却有点力不从心,(据说需要调用微软的com组件,php还需要安装扩展),用记事本读取xls,满屏的乱码,找不到头绪.
从网上找过一个php写入xls文件的类,很简单,只有5个方法,但是是生成最简单的xls文件,比csv强不到哪里.但是,我从类里却看出了一点门道,这个类输出的是个xml代码,然后放出几个header声明了MIME类型,这样下载下来就是以xml写的xls格式文件.那么就是说,excel同样支持xml显示数据(这个我是刚知道的,)
于是我新建了一个xls文档,用excel打开,输入简单数据和设置了下格式之后,另存为 xml 表格 格式,然后让excel打开这个xml文件,数据和格式都完整显示了.假如将这个xml的后缀改成xls,肯定也没问题了.
那么我们拿着这个xml文档用作模板让php读取,去动态输出数据,然后和那个类一样,抛出几个关键的header,就能搞定xls格式的报表下载了.
我一直使用thinkphp框架做php开发,设置的模板默认后缀为html,肯定不能读取xml的后缀,所以如果应用于框架级别的模板,你需要修改后缀xml为html等需要的.对于smarty模板引擎就完全不用担心了.
下面是个我生成的xml:
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Created>1996-12-17T01:32:42Z</Created>
<LastSaved>2010-09-04T07:06:33Z</LastSaved>
<Version>11.9999</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<RemovePersonalInformation/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>4530</WindowHeight>
<WindowWidth>8505</WindowWidth>
<WindowTopX>480</WindowTopX>
<WindowTopY>120</WindowTopY>
<AcceptLabelsInFormulas/>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s21">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
</Style>
</Styles>
<Worksheet ss:Name="Sheet1">
<Names>
<NamedRange ss:Name="Print_Area" ss:RefersTo="=Sheet1!R1C1:R17C5"/>
</Names>
<Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="3" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
<Column ss:AutoFitWidth="0" ss:Width="52.5"/>
<Column ss:Index="3" ss:AutoFitWidth="0" ss:Width="65.25"/>
<Column ss:AutoFitWidth="0" ss:Width="81"/>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位1</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位2</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位3</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位4</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位5</Data><NamedCell
ss:Name="Print_Area"/></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s21"><Data ss:Type="Number">23</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="Number">23</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="Number">234</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="Number">4</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="Number">34</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:Formula="=SUM(RC[-5]:RC[-1])"><Data ss:Type="Number">318</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s21"><Data ss:Type="Number">23</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="Number">23</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="Number">234</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="Number">4</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="Number">34</Data><NamedCell
ss:Name="Print_Area"/></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Unsynced/>
<Selected/>
<FreezePanes/>
<FrozenNoSplit/>
<SplitVertical>3</SplitVertical>
<LeftColumnRightPane>3</LeftColumnRightPane>
<ActivePane>1</ActivePane>
<Panes>
<Pane>
<Number>3</Number>
</Pane>
<Pane>
<Number>1</Number>
<ActiveRow>5</ActiveRow>
<ActiveCol>6</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
这段xml本来有三个Worksheet,对应三个工作表,对于最后没用到的那俩就删除了,只保留了第一个.(这个可以根据需要添加),唯一的一个工作表标记<Worksheet ss:Name="Sheet1">,我们很简单就能看出来Sheet1是该工作表的名称,这个地方可以是动态设置的.
<Names>
<NamedRange ss:Name="Print_Area" ss:RefersTo="=Sheet1!R1C1:R17C5"/>
</Names>
这段是声明该工作表的打印区域,后面的属性不太懂,貌似是个参考的打印区域.实际的打印区域在后面设置.
<Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="3" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
这段很重要,对于需要表格线显示的xls,会自动出现这个table标记,属性ExpandedColumnCount是列数,一般列数是固定的,如果不固定请动态设置这里.ExpandedRowCount是行数,而行数一般是不固定的,所以需要设置这里和下面的数据行数一致.如果这两个属性和实际的数据行数和列数不一致,excel就会报错.一定要注意.
<Column ss:AutoFitWidth="0" ss:Width="52.5"/>
这种是设置列属性的,一般让excel去做这部分,不需要手工去改.
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位1</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位2</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位3</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位4</Data><NamedCell
ss:Name="Print_Area"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">栏位5</Data><NamedCell
ss:Name="Print_Area"/></Cell>
</Row>
好了,上面是一行数据,和html的table里的
<tr>
<td>...</td>
</tr>
是不是很像?
你只需要动态输出Data标记间的数据就行了,显示的效果让excel去做,千万注意cell的个数和row行数,一定要和table标记里的那两个属性一致.
<Cell ss:Formula="=SUM(RC[-5]:RC[-1])"><Data ss:Type="Number">318</Data></Cell>
这个单元格是在excel里设置过函数的
通观这大段的xml代码,实际需要我们操作的很少,很多只需要在excel里面设置好就行了.
了解了excel支持的这段xml格式,你还头疼xls格式的报表下载吗? 呵呵
分享到:
相关推荐
这种格式支持复杂的计算和格式化,但处理大量数据时可能会遇到性能问题。 CSV(Comma Separated Values)文件则是一种轻量级的数据交换格式。它以纯文本形式存储表格数据,每一行代表一条记录,列之间用逗号分隔。...
"导出pdf、csv、excel报表"这一主题涵盖了三种常见的数据格式,它们在数据交换、存储和分析中扮演着关键角色。以下将详细介绍这些格式及其相关知识点。 PDF(Portable Document Format)是一种用于保留文档布局和...
但CSV文件无法直接在Excel中应用复杂的公式和格式,因此转换成XLS格式就显得很有必要。 转换过程通常包括以下步骤: 1. 导入CSV文件:用户选择需要转换的CSV文件,工具会读取文件中的数据。 2. 分析数据结构:工具...
**jasperreport** 是一个强大的开源报告生成工具,它允许开发者设计复杂的报表并以多种格式输出,如PDF、HTML、XML、CSV以及XLS。在Java应用中,jasperreport通常用于生成数据可视化的静态或交互式报表。这个源码...
本文将深入探讨如何使用jQuery实现一个分页列表,并进一步介绍如何添加输出XLS、PDF和CSV格式的功能。 首先,让我们讨论分页列表的实现。分页是网页数据展示中常用的一种技术,尤其当数据量大时,为了提高用户体验...
在IT行业中,处理数据时,Excel和CSV文件是非常常见的格式,尤其在数据分析、报表生成以及数据交换等场景中。本话题主要围绕“NPOI读写Excel”和“第三方DLL读写CSV文件”这两个核心知识点展开,同时提供了一系列...
在IT领域,数据处理是日常工作中不可或缺的一部分,而CSV(Comma Separated Values)和XLS(Excel)格式则是常见的数据存储方式。CSV文件因其简洁、通用性而被广泛使用,而XLS文件则提供了更丰富的格式化和计算功能...
此外,Aspose.Cells还提供了丰富的样式和格式选项,如设置单元格字体、颜色、边框、填充、对齐方式等,以及创建和编辑公式、图表、图片等复杂元素。对于需要创建复杂报表的开发人员来说,这些都是非常实用的功能。 ...
本教程将重点关注如何在C#的WinForm应用中操作SQL Server数据库,并实现Excel(xls)、CSV和TXT文件的导入导出功能。这在数据处理、报表生成以及数据交换等场景中非常实用。 首先,要与SQL Server进行交互,你需要...
Excel是一种功能强大的电子表格软件,常用于数据分析、报表制作等,而CSV(Comma Separated Values)文件则是一种通用的数据交换格式,因其简洁和兼容性广泛而受到青睐。本教程将详细介绍如何通过脚本将Excel文件...
在Java编程中,导出CSV(Comma Separated Values)和Excel文件是常见的数据处理任务,特别是在数据分析、报表生成和数据交换场景下。本篇将详细介绍如何在Java中实现这两个功能,无需指定下载路径,直接将文件保存到...
- 图表操作:能够创建、编辑和格式化各种类型的图表,如柱状图、折线图、饼图等,并可以调整其样式和数据源。 - 数据验证:支持设置数据验证规则,限制用户输入的数据类型或范围。 - 图像处理:可以插入和调整...
使用Spire.XLS,开发者可以轻松创建新的Excel工作簿,添加工作表,设置单元格的值,以及自定义样式和格式。例如,你可以创建带有图表、公式、条件格式的复杂表格。 3. **读取Excel数据**: 对于已存在的Excel文件...
由于单片机通常不具备直接生成或解析复杂文件格式如Excel (.XLS) 的能力,我们可以采用一种简单的替代方法,即生成类似CSV(逗号分隔值)的文本文件,然后由PC端的软件(如Excel)读取并转换为正式的Excel格式。...
Spire.XLS可能用于读取和操作Excel数据,而Spire.Pdf可能用于生成或读取PDF文档,虽然在描述中没有直接提到PDF,但有时转换工具会提供多种输出格式。 3. **Microsoft.mshtml.dll**:这是微软的HTML渲染组件,可能...
CSV格式因其通用性和简洁性,常用于数据交换。下面我们将详细介绍如何使用VBA结合ADO来读取CSV文件。 首先,确保你的系统已经安装了Microsoft ActiveX Data Objects (ADO)库。在VBA环境中,可以通过“工具”->...
JasperReports支持多种输出格式,包括PDF、Excel (XLS)、HTML、CSV、XML、TXT等,这使得报表能够适应不同的应用场景。 ### 二、环境准备 在开始之前,你需要以下组件: 1. Java Development Kit (JDK):因为...
EasyPOI通常用于快速生成报表,处理大批量数据,如批量生成Excel报表,或者从Excel中读取大量数据到数据库。 4. **EasyPOI的优势**:EasyPOI通过模板方式,减少了代码量,提高了开发效率。只需提供一个Excel模板,...
4. **TDMS转Excel**:这个过程通常需要一个中间转换步骤,将TDMS文件的内容提取出来,然后保存为Excel可以识别的格式,如CSV或XLSX。 5. **TDMS转换**:转换过程可能涉及到解析TDMS文件的结构,提取数据,然后在...
在IT行业中,C#是一种广泛使用的编程语言,尤其在...通过以上方法,开发者可以灵活地在C#项目中处理Excel文件,满足导入图片和转换为CSV格式的需求。这些功能在数据处理、报表生成和自动化任务中具有广泛的应用价值。