Adobe ColdFusion读写Microsoft Office Excel数据(3)

  在实际应用中,除了对已有Excel表单进行读写操作外,我们很有可能会需要将系统数据导出到Excel文件。导出Excel实质上是利用现有的数据新建一个Excel文件。ColdFusion9很容易实现这个功能。下面笔者将通过小示例来演示一下。

  首先新建一个ColdFusion Page, create.cfm. 将下面的代码添加进去。

<!--- Get data --->
<cfquery name="arts" datasource="cfartgallery">
	SELECT * 
	FROM ART
</cfquery>

<!--- Create spreadsheet --->
<cfspreadsheet action="write"
	filename="Arts.xls"
	query="arts"
	overwrite="true">

  此处cfquery标签的datasource属性为安装ColdFusion9时自带的示例数据源,cfartgallery. 利用ColdFusion Builder的RDS Query Viewer可以对其中数据进行查看,先来看一下ART表中的数据,如图1.

图 1

  从代码中可以看出其功能是将ART表中的内容读入到arts查询中,然后写入到一个新的Excel文件Arts.xls. overwrite=”true”保证如果Excel表单不存在则创建,存在则覆盖。

  在浏览器中运行,可以看到当前目录下多了一个Excel文件,效果如图2.

图 2

  上面的示例仅仅是将数据库中的数据通过ColdFusion查询写入到一个新的Excel表单中。这是最原始的方法,其中并没有在意新建的Excel表单的美观程度,也没有我们很想要的汇总等等脚注信息,这可不是一个“制作精良”的表单。其实ColdFusion提供了好多方法可以更加灵活的对要写入Excel的数据进行处理,包括添加表单属性,设置格式,设置公式等等。

  为了演示这些功能,新建一个ColdFusion Page, decorate.cfm. 这里将再次用第一篇随笔中那个造出来的数据,如图3.

图 3

  要完成这个Demo, 我们采用下面的步骤(有些步骤并不是必须的,当然这些也可以不是所有的步骤)。

  步骤1把数据读取到一个查询中备用。实现方法是将下面的代码添加到decorate.cfm.

<!--- Read as query --->
<cfspreadsheet
	action="read"
	src="Sales.xls"
	query="myQuery">

  步骤2利用spreadsheetNew方法新建一个表单对象:

<!--- Create new spreadsheet --->
<cfset sObj=spreadsheetNew()>

  步骤3为这个新建的表单添加一些属性信息:

<!--- Set sheet properties --->
<cfset info=StructNew()>
<cfset info.title="Sales Detail">
<cfset info.author="spoony">
<cfset info.comments="comments for the sales detail sheet">
<cfset spreadsheetAddInfo(sObj, info)>

  步骤4为表单添加一个标题,并进行以下修饰以便使它能与内容区分出来:

 <!--- Create and format header row --->
 <cfset spreadsheetAddRow(sObj, "Sales detail: ")>
 <cfset spreadsheetFormatRow(sObj, {bold="true", italic="true", fontsize="12"}, 1)>

  步骤5将步骤1中获取的数据填入到新建的表单对象中:

<!--- Add data from query --->
<cfset spreadsheetAddRows(sObj, myQuery)>
<cfset spreadsheetFormatRow(sObj, {bold="true", alignment="center"}, 2)>

  步骤6定义一些变量以便以后使用。注意公式信息同Excel中语法是一致的:

<!--- Figure out row for formula, 2 afer data --->
<cfset rowDataStart=2>
<cfset rowDataEnd=myQuery.recordcount+1>
<cfset rowTotal=rowDataEnd+2>
<cfset totalFormulaB="SUM(B#rowDataStart#:B#rowDataEnd#)">
<cfset totalFormulaC="SUM(C#rowDataStart#:C#rowDataEnd#)">
<cfset totalFormulaD="SUM(D#rowDataStart#:D#rowDataEnd#)">
<cfset totalFormulaE="SUM(E#rowDataStart#:E#rowDataEnd#)">

  步骤7设置汇总单元格,并应用步骤6中的公式计算:

<!--- Add total formula --->
<cfset spreadsheetSetCellValue(sObj, "TOTAL: ", rowTotal, 1)>
<cfset spreadsheetSetCellFormula(sObj, totalFormulaB, rowTotal, 2)>
<cfset spreadsheetSetCellFormula(sObj, totalFormulaC, rowTotal, 3)>
<cfset spreadsheetSetCellFormula(sObj, totalFormulaD, rowTotal, 4)>
<cfset spreadsheetSetCellFormula(sObj, totalFormulaE, rowTotal, 5)>

  步骤8对数值列进行修饰:

<!--- Formate amount column as currency --->
<cfset spreadsheetFormatColumn(sObj, {dataformat="$00000.00"}, 2)>
<cfset spreadsheetFormatColumn(sObj, {dataformat="$00000.00"}, 3)>
<cfset spreadsheetFormatColumn(sObj, {dataformat="$00000.00"}, 4)>
<cfset spreadsheetFormatColumn(sObj, {dataformat="$00000.00"}, 5)>

  步骤9最后一步,将刚才新建的表单对象写入到Excel文件中:

  <!--- Save it --->
  <cfspreadsheet action="write"
	  name="sObj"
	  filename="SalesDecorated.xls"
	  overwrite="true">

  在浏览器中运行,会发现在当前目录中生成了一个新的Excel文件SalesDecorated.xls. 如图4. 是不是比图3稍微美观一些?

图 4

  这几篇随笔只是将ColdFusion9与Excel交互的最基本功能进行了简单介绍。这只是实际应用的开始。实际中的操作将会涉及更具体的内容,您会发现ColdFusion9的这个功能的确是个好帮手。

  Enjoy!

posted @ 2010-01-23 15:27  spoony  阅读(1094)  评论(0编辑  收藏  举报