.net如何用excel制作报表模板做报表

怎么样读取Excel表格中的数据(C#.Net)
- 天飞 - 博客园
其实读取Excel表格中的数据和读取数据库中的数据是非常类似的,因为在某种程度上Excel表格可以看成是一张一张的数据表。其二者的主要区别在于所使用的数据引擎不一样。在本文的程序中,通过下列代码实现读取Excel表格数据,具体如下:
//创建一个数据链接
string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = c:\\sample.Extended Properties=Excel 8.0" ;
OleDbConnection myConn = new OleDbConnection ( strCon ) ;
string strCom = " SELECT * FROM [Sheet1$] " ;
myConn.Open ( ) ;
file://打开数据链接,得到一个数据集
OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;
file://创建一个 DataSet对象
myDataSet = new DataSet ( ) ;
file://得到自己的DataSet对象
myCommand.Fill ( myDataSet , "[Sheet1$]" ) ;
file://关闭此数据链接
myConn.Close ( ) ;&
  怎么样读取Excel表格中的数据其实和读取数据库中的数据没有什么实质上的区别。
  注释:这里读取的是C盘根目录下的"Sample.xls"文件。
---------------------------------------------------------------------
将数据库表导出到Excel,并生成文件(C#实现)
&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
需添加项目引用:
1. .NET-&System.Data.OracleClient.dll
2. COM-&Microsoft Excel 11.0 Object Library
代码如下:
using System.IO;
using System.D
using System.R
using System.D
using System.C
using System.C
namespace ProtoType
&/// 套用模板输出Excel,生成xls文件和html文件
&/// Author: Liu Wen
&/// Date Created: 2006-8
&public class ExportExcel
&&#region variable member
&&protected string templateFile =
&&protected string excelFile =
&&protected string htmlFile =
&&protected object missing = Missing.V
&&Excel.ApplicationC
&&private DateTime beforeT&&//Excel启动之前时间
&&private DateTime afterT&&//Excel启动之后时间
&&#endregion
&&/// 构造函数,将一个已有Excel工作簿作为模板,并指定输出路径
&&/// Excel模板文件路径
&&/// Excel输出文件路径
&&/// Html输出文件路径
&&public ExportExcel(string templateFile, string excelFile, string htmlFile)
&&&if(templateFile == null)
&&&&throw new Exception("Excel模板文件路径不能为空!");
&&&if(excelFile == null)
&&&&throw new Exception("Excel输出文件路径不能为空!");
&&&if(htmlFile == null)
&&&&throw new Exception("Html输出文件路径不能为空!");
&&&if(!File.Exists(templateFile))
&&&&throw new Exception("指定路径的Excel模板文件不存在!");
&&&this.templateFile = templateF
&&&this.excelFile = excelF
&&&this.htmlFile = htmlF
&&&//创建一个Application对象
&&&beforeTime = DateTime.N
&&&app = new ApplicationClass();
&&&//app.Visible =
&&&afterTime = DateTime.N
&&&//打开模板文件,得到WorkBook对象
&&&&book = app.Workbooks.Open(templateFile,missing,missing,missing,missing,missing,
&&&&&missing,missing,missing,missing,missing,missing,missing,missing,missing);
&&&catch (Exception e)
&&&//得到WorkSheet对象
&&&sheet = (Excel.Worksheet)book.Sheets.get_Item(1);
&&/// 将DataTable数据导出到Excel(可动态插入行)
&&/// DataTable
&&/// 插入行的索引
&&/// 插入列的索引
&&public void DataTableToExcel(System.Data.DataTable dt, int rowIndex, int colIndex)
&&&//range = sheet.get_Range("A7", missing);
&&&//range.Value2 = "raogerrr";
&&&//string str = range.Text.ToString();
&&&int rowCount = dt.Rows.C&&//DataTable行数
&&&int colCount = dt.Columns.C&//DataTable列数
&&&//将数据导出到相应的单元格
&&&for (iRow = 0; iRow & rowC iRow++)
&&&&//插入新行
&&&&this.InsertRows(sheet, iRow+rowIndex);
&&&&//填充当前行
&&&&for (iCol = 0; iCol & colC iCol++)
&&&&&sheet.Cells[iRow+rowIndex, iCol+colIndex] = dt.Rows[iRow][iCol].ToString();
&&&this.DeleteRows(sheet, rowCount+rowIndex);&
&&&//Excel.QueryTables qts = sheet.QueryT
&&&//Excel.QueryTable qt = qts.Add(,,);
&&&//qt.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireR
&&&//qt.Refresh();
&&/// 将DataTable数据导出到Excel(可动态插入行)
&&/// DataTable
&&/// 插入数据的起始单元格
&&public void DataTableToExcel(System.Data.DataTable dt, string cellID)
&&&int rowIndex = sheet.get_Range(cellID, missing).R
&&&int colIndex = sheet.get_Range(cellID, missing).C
&&&int rowCount = dt.Rows.C&&//DataTable行数
&&&int colCount = dt.Columns.C&//DataTable列数
&&&//利用二维数组批量写入
&&&string[,] array = new string[rowCount,colCount];
&&&for (iRow = 0; iRow & rowC iRow++)
&&&&for (iCol = 0; iCol & colC iCol++)
&&&&&array[iRow,iCol] = dt.Rows[iRow][iCol].ToString();
&&&for (iRow = 0; iRow & rowC iRow++)
&&&&this.InsertRows(sheet, iRow+rowIndex);
&&&this.DeleteRows(sheet, rowCount+rowIndex);
&&&range& = sheet.get_Range(cellID, missing);
&&&range = range.get_Resize(rowCount, colCount);
&&&range.Value2 =
&&/// 将DataTable数据导出到Excel(固定)
&&/// DataTable
&&/// 插入数据的起始单元格
&&public void DataTableToExcel2(System.Data.DataTable dt, string cellID)
&&&int rowCount = dt.Rows.C&&//DataTable行数
&&&int colCount = dt.Columns.C&//DataTable列数
&&&//利用二维数组批量写入
&&&string[,] array = new string[rowCount,colCount];
&&&for (iRow = 0; iRow & rowC iRow++)
&&&&for (iCol = 0; iCol & colC iCol++)
&&&&&array[iRow,iCol] = dt.Rows[iRow][iCol].ToString();
&&&range& = sheet.get_Range(cellID, missing);
&&&range = range.get_Resize(rowCount, colCount);
&&&range.Value2 =
&&/// 输出生成的Excel, Html文件
&&public void OutputFile()
&&&if (this.excelFile == null)
&&&&throw new Exception("没有指定Excel输出文件路径!");
&&&if (this.htmlFile == null)
&&&&throw new Exception("没有指定Htmll输出文件路径!");
&&&&book.SaveAs(excelFile, missing, missing, missing, missing, missing,
&&&&&Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing,missing);
&&&&book.SaveAs(htmlFile, Excel.XlFileFormat.xlHtml, missing, missing, missing, missing,
&&&&&Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
&&&catch (Exception e)
&&&finally
&&&&this.Dispose();
&&/// 在工作表中插入行,并调整其他行以留出空间
&&/// 当前工作表
&&/// 欲插入的行索引
&&private void InsertRows(Excel.Worksheet sheet, int rowIndex)
&&&Range r = (Excel.Range)sheet.Rows[rowIndex, missing];&&
&&&//object Range.Insert(object shift, object copyorigin);
&&&//shift: Variant类型,可选。指定单元格的调整方式。可以为下列 XlInsertShiftDirection 常量之一:
&&&//xlShiftToRight 或 xlShiftDown。如果省略该参数,Microsoft Excel 将根据区域形状确定调整方式。
&&&r.Insert(Excel.XlInsertShiftDirection.xlShiftDown, missing);&&
&&/// 在工作表中删除行
&&/// 当前工作表
&&/// 欲删除的行索引
&&private void DeleteRows(Excel.Worksheet sheet, int rowIndex)
&&&Range r = (Range)sheet.Rows[rowIndex, missing];
&&&r.Delete(Excel.XlDeleteShiftDirection.xlShiftUp);
&&/// 退出Excel,并且释放调用的COM资源
&&private void Dispose()
&&&book.Close(missing, missing, missing);
&&&app.Workbooks.Close();
&&&app.Quit();
&&&if(range != null)
&&&&System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
&&&&range =
&&&if(sheet != null)
&&&&System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
&&&&sheet =
&&&if(book != null)
&&&&System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
&&&&book =
&&&if(app != null)
&&&&System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
&&&GC.Collect();
&&&this.KillExcelProcess();
&&/// 结束Excel进程
&&private void KillExcelProcess()
&&&DateTime startT
&&&Process[] processes = Process.GetProcessesByName("Excel");
&&&//得不到Excel进程ID,暂时只能判断进程启动时间
&&&foreach (Process process in processes)
&&&&startTime = process.StartT
&&&&if(startTime & beforeTime && startTime & afterTime)
&&&&&process.Kill();
阅读(...) 评论().net如何做Excel报表
1、水晶报表(Crystal Reports)的表头能不能冻结,即:记录多的时候,记录翻页而报表的头部持久显示;如果能怎么实现。
2、水晶报表在设计的时候表头字段是拖上去的,如果要做一个报表定制工具,这个表头能用程序控制吗?(非vs2005自带的水晶报表)
3、OWC组建在用vs2005做Web开发的时候为什么添加不到工具栏,而vs2003可以,vs2005的Winform程序也可以。
正是前面提到的问题1和问题2无法解决,现在要把整个系统中的水晶报表换成用Excel实现,Excel实现也存在一些问题,有难度,首先是报表表头的样式的控制,当然这我们可以用宏,但宏是不安全的,所有人都知道,不用宏就只能用VBA语句了,这个对我来说是比较陌生;其次是数据的统计和图表的显示;最后就是用户根据需求自行定制报表,这个灵活性太大,整个模型中数据表就近400张,组织管理细节太多。
先完成了一个小试验,分享一下吧,试验的内容包括:
1、&用简单的VBA语句给Excel中写数据。
2、&将Excel放置在Web页面上来操作。
3、&通过不同框架传值来更新Web页面上的Excel数据内容。
4、&控制输出上下标格式的数据。
5、&更新Excel内容时强制结束前一个Excel进程(同时也会结束用户进程,是本实例的一个bug)。
一、新建一个网站,添加一个纯页面,在页面上定义两个框架,如下:
&!DOCTYPE&html&PUBLIC&&-//W3C//DTD&XHTML&1.0&Transitional//EN&&&http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&
&html&xmlns=&http://www.w3.org/1999/xhtml&&&
&&&&&title&无标题页&/title&
&frameset&rows&=&30,80%&&&&!--border=&0&&framespacing=&0&&frameborder=&1&--&
&&&&&&&&&frame&name=&Input&&marginwidth=&0&&marginheight=&0&&src=&Input.aspx&&scrolling=&no&/&
&&&&&&&&&frame&name=&Output&&src=&Output.aspx&&scrolling=&no&&/&
&/frameset&
二、在添加一个输入的aspx页面:Input.aspx。在页面上放置一个DropDownList,命名为DDL_Time,和一个Button命名为BN_Query,在cs文件中写下面代码:
using&System.C
using&System.W
using&System.Web.S
using&System.Web.UI;
using&System.Web.UI.WebC
using&System.Web.UI.WebControls.WebP
using&System.Web.UI.HtmlC
using&System.T
public&partial&class&Input&:&System.Web.UI.Page
&&&&protected&void&Page_Load(object&sender,&EventArgs&e)
&&&&&&&&if&(!IsPostBack)
&&&&&&&&&&&&DDL_Time.Items.Add(&&);
&&&&&&&&&&&&DDL_Time.Items.Add(&&);
&&&&&&&&&&&&DDL_Time.SelectedIndex&=&0;
&&&&protected&void&BN_Query_Click(object&sender,&EventArgs&e)
&&&&&&&&Location(&Output.aspx?Time=&&+&DDL_Time.SelectedItem.ToString());
&&&&/**////&&summary&
&&&&///&页面重载
&&&&///&&/summary&
&&&&public&void&Location(string&sPath)
&&&&&&&&StringBuilder&sb&=&new&StringBuilder();
&&&&&&&&sb.Append(&&script&language=\&javascript\&&&\n&);
&&&&&&&&sb.Append(&parent.frames['Output'].location.href='&&+&sPath&+&&';&);
&&&&&&&&sb.Append(&&/script&&);
&&&&&&&&System.Web.HttpContext.Current.Response.Write(sb.ToString());
三、再做一个Excel报表的模板,命名为Nomalr.xls,建一个简单的数据库,结构如下:
四、在添加一个输出的aspx页面:Output.aspx,在页面上放置一个label,来显示input框架传递过来的参数,在cs文件中添加代码如下:
using&System.D
using&System.C
using&System.C
using&System.W
using&System.Web.S
using&System.Web.UI;
using&System.Web.UI.WebC
using&System.Web.UI.WebControls.WebP
using&System.Web.UI.HtmlC
using&Excel&=&Microsoft.Office.Interop.E
using&System.R
using&System.Data.OleDb;
using&System.IO;
using&System.D
public&partial&class&Output&:&System.Web.UI.Page
&&&&OleDbConnection&O
&&&&OleDbCommand&OleC
&&&&DataTable&DT&=&new&DataTable();
&&&&private&string&StrTime&=&&&;
&&&&protected&void&Page_Load(object&sender,&EventArgs&e)
&&&&&&&&//接收Input框架传递的参数
&&&&&&&&if&(!IsPostBack)
&&&&&&&&&&&&StrTime&=&Request.QueryString[&Time&];
&&&&&&&&&&&&if&(StrTime&!=&null)
&&&&&&&&&&&&&&&&Label1.Text&=&&时间:&&+&StrT
&&&&&&&&//在页面加载的时候将数据取出
&&&&&&&&if&(ConnectionDataBase())
&&&&&&&&&&&&OleCamm&=&new&OleDbCommand();
&&&&&&&&&&&&OleCamm.Connection&=&O
&&&&&&&&&&&&Olecn.Open();
&&&&&&&&&&&&mandText&=&&select&*&from&pl&where&date&=&&&+&&'&&+&StrTime&+&&'&;
&&&&&&&&&&&&OleDbDataAdapter&OleDAdp&=&new&OleDbDataAdapter(OleCamm);
&&&&&&&&&&&&OleDAdp.Fill(DT);
&&&&&&&&&&&&Olecn.Close();
&&&&&&&&Exceltest();
&&&&/**////&&summary&
&&&&///&连接数据库
&&&&///&&/summary&
&&&&///&&returns&&/returns&
&&&&private&bool&ConnectionDataBase()
&&&&&&&&try
&&&&&&&&&&&&string&DataSource&=&Server.MapPath(&~&)&+&&\\App_Data\\Excel.mdb&;
&&&&&&&&&&&&Olecn&=&new&OleDbConnection(&Provider=Microsoft.Jet.OLEDB.4.0;Data&Source=&+DataSource);
&&&&&&&&&&&&Olecn.Open();
&&&&&&&&catch&(Exception&e1)
&&&&&&&&&&&&Response.Write(e1.Message);
&&&&&&&&&&&&return&false;
&&&&&&&&finally
&&&&&&&&&&&&Olecn.Close();
&&&&&&&&return&true;
&&&&/**////&&summary&
&&&&///&对Excel的操作
&&&&///&&/summary&
&&&&private&void&Exceltest()
&&&&&&&&//在创建Excel&Application前先将已经打开的Excel资源释放掉
&&&&&&&&EndExcelProcesse();
&&&&&&&&//指定模板文件
&&&&&&&&FileInfo&mode&=&new&FileInfo(Server.MapPath(&~&)&+&&\\Nomarl.xls&);
&&&&&&&&//打开复制后的文件X
&&&&&&&&object&missing&=&Missing.V
&&&&&&&&Excel.Application&myExcel&=&new&Excel.Application();
&&&&&&&&//打开模板文件
&&&&&&&&myExcel.Application.Workbooks.Open(mode.FullName,&missing,&missing,&missing,&missing,&missing,&missing,&missing,&missing,&missing,&
missing,&missing,&missing,&missing,&missing);
&&&&&&&&//选中有数据的Cells
&&&&&&&&Excel.Workbook&myBook&=&myExcel.Workbooks[<span style="color: #];
&&&&&&&&Excel.Worksheet&mySheet&=&(Excel.Worksheet)myBook.Worksheets[<span style="color: #];
&&&&&&&&Excel.Range&r&=&mySheet.get_Range(mySheet.Cells[<span style="color: #,&<span style="color: #],&mySheet.Cells[DT.Rows.Count&+&<span style="color: #,&DT.Columns.Count&-&<span style="color: #]);
&&&&&&&&r.Select();
&&&&&&&&//不单独显示Excel,最后在IE中显示
&&&&&&&&myExcel.Visible&=&false;
&&&&&&&&//第一行为报表的标题
&&&&&&&&myExcel.Cells[<span style="color: #,&<span style="color: #]&=&&用模板导出的报表&;
&&&&&&&&//逐行写入数据,数组中第一行为报表的列标题
&&&&&&&&for&(int&i&=&<span style="color: #;&i&&&DT.Columns.Count&-&<span style="color: #;&i++)
&&&&&&&&&&&&myExcel.Cells[<span style="color: #,&<span style="color: #&+&i]&=&DT.Columns[i].C&;
&&&&&&&&//为报表填充数据并设置显示上下标格式
&&&&&&&&for&(int&i&=&<span style="color: #;&i&&&DT.Rows.C&i++)
&&&&&&&&&&&&for&(int&j&=&<span style="color: #;&j&&&DT.Columns.Count&-&<span style="color: #;&j++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&myExcel.Cells[<span style="color: #&+&i,&<span style="color: #&+&j]&=&DT.Rows[i][j];
&&&&&&&&&&&&}
&&&&&&&&&&&&string&a&=&DT.Rows[i][DT.Columns.Count-<span style="color: #].ToString();
&&&&&&&&&&&&string&b&=&DT.Rows[i][DT.Columns.Count-<span style="color: #].ToString();
&&&&&&&&&&&&string&c&=&DT.Rows[i][DT.Columns.Count&-<span style="color: #].ToString();
&&&&&&&&&&&&myExcel.Cells[<span style="color: #&+&i,&DT.Columns.Count&-&<span style="color: #]&=&a&+&b&+&c;
&&&&&&&&&&&&//控制输出样式为下标
&&&&&&&&&&&&mySheet.get_Range(mySheet.Cells[i&+&<span style="color: #,&DT.Columns.Count&-&<span style="color: #],&mySheet.Cells[i&+&<span style="color: #,
&DT.Columns.Count&-&<span style="color: #]).get_Characters(a.Length&+&<span style="color: #,&b.Length).Font.Subscript&=&true;
&&&&&&&&&&&&//控制输出样式为上标
&&&&&&&&&&&&mySheet.get_Range(mySheet.Cells[i&+&<span style="color: #,&DT.Columns.Count&-&<span style="color: #],&mySheet.Cells[i&+&<span style="color: #,&
DT.Columns.Count&-&<span style="color: #]).get_Characters(a.Length&+&b.Length&+&<span style="color: #,&c.Length).Font.Superscript&=&true;
&&&&&&&&&&&&mySheet.Columns.AutoFit();
&&&&&&&&//在当前目录下指定一个临时文件
&&&&&&&&string&FileName&=&Server.MapPath(&~&)&+&&\\Temp.xls&;
&&&&&&&&if&(File.Exists(FileName))
&&&&&&&&&&&&File.Delete(FileName);
&&&&&&&&myExcel.Save(FileName);
&&&&&&&&mySheet.Cells.Clear()&;
&&&&&&&&//设置不出现保存提示框
&&&&&&&&myBook.Saved&=&true;
&&&&&&&&myExcel.Application.Workbooks.Close();
&&&&&&&&//将Excel文件嵌入在IE里面,也可以在aspx页面用
&&&&&&&&//&iframe&id=&myExcelHtml&&src&=&E:\\练习\\excell\\WebSite2\\Temp.xls&&width=&100%&&height=&100%&&runat&=&server&&&/iframe&
&&&&&&&&//标签来嵌入
&&&&&&&&Response.ClearContent();
&&&&&&&&Response.ClearHeaders();
&&&&&&&&Response.ContentType&=&&application/vnd.ms-excel&;
&&&&&&&&Response.AddHeader(&Content-Disposition&,&&filename='我的文件'&);
&&&&&&&&Response.WriteFile(FileName);
&&&&&&&&Response.Flush();
&&&&&&&&Response.Close();
&&&&/**////&&summary&
&&&&///&当报表数据更新时,先强制结束前一个报表的数据源
&&&&///&这种方法会同时杀死掉用户的excel进程
&&&&///&&/summary&
&&&&protected&void&EndExcelProcesse()
&&&&&&&&try
&&&&&&&&{&&&&
&&&&&&&&&&&&Process[]&myProcesses&=&Process.GetProcessesByName(&excel&);
&&&&&&&&&&&&foreach&(Process&instance&in&myProcesses)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&instance.Kill();&&&//强制终止&&&&
&&&&&&&&&&&&}
&&&&&&&&catch&{&}
&&&&&&&&//在网上查的用下面的方法结束Excel进程表较好,但一直没有效果
&&&&&&&&//try
&&&&&&&&//{
&&&&&&&&//&&&&System.Runtime.InteropServices.Marshal.ReleaseComObject(r);
&&&&&&&&//&&&&System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);
&&&&&&&&//&&&&System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
&&&&&&&&//&&&&System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
&&&&&&&&&&&&
&&&&&&&&//&&&&myBook&=&
&&&&&&&&//&&&&mySheet&=&
&&&&&&&&//&&&&myExcel&=&
&&&&&&&&//&&&&r&=&
&&&&&&&&//&&&&GC.Collect();
&&&&&&&&//}
&&&&&&&&//catch&{&}
整个试验的程序结构为:
运行后的结果:
阅读本文后您有什么感想? 已有
人给出评价!
12-06-0111-09-0611-09-0411-07-0811-05-2411-03-0711-02-2711-01-21
注:您的评论需要经过审核才会显示出来
Copyright &
PC6下载().All Rights Reserved
备案编号:湘ICP备号下次自动登录
现在的位置:
& 综合 & 正文
asp.net中利用XML描述文件和Excel模板相结合的方法生成Excel报表
在一般的企业应用开发中都会涉及到报表的生成,且一般报表的格式都是生成Excel格式的。对于各种报表的生成一直是员心中永远的痛,因为对于很多程序员来说每写一个报表都意味着要写一大断来实现,而且有的报表可能极其复杂以及不规范,这时就会浪费程序员大量的时间来编写和调试这些代码,那到底有没有一种方法能使代码尽量少写,且又能实现各种Excel报表的生成呢,下面我们就转入正题。
  我们要生成Excel报表,其实我们只需要两样东西:
  这个XML中结点Excelstyle的属性Sort描述了整个Excel的格式是纵向的还是横向的(所谓纵向还是横向,我上面已有所说明),而属性Space则描述了报表每个记录的行与行之间空多少行。Ranges则是下面的所有子节点RangeStyle的父节点,对于一张报表通常会有很多的RangeStyle结点。RangeStyle其实就开始真正来描述哪个或哪些单元格来填写哪些字段,如结点Range 就定义了单元格高度,宽度,边框宽度,颜色这些属性。TitleCell就是定义了报表(因为我这张是纵向报表,所以有Title)Title的属性,如Title的名称,哪个单元格来填写这个名称。节点DataCell则定义了要帮定数据中的哪个字段,从哪个单元开始填写,单元格是否要合并,对齐方式,还有这个字段行与行之间的间隔。结点Title
Font定义了Title字体属性,如大小,颜色,是否斜体,是否粗体,对齐方式。结点DataFont则定义了数据字体的属性,如大小,颜色,是否斜体,是否粗体,对齐方式。一个RangeStyle结点其实也就定义了一个字段的填写,如果你的报表要填写很多字段的话,就会有很多个RangeStyle结点来描述。这个xml样式定义文件可以自己写个工具来生成,我有现成的自己写的生成工具叫ExcelStyle,不过还很简陋,用起来还不方便,不过能生成我需要的样式,哪位需要我可以发给你们(我不知道怎么提供下载)。
  XML描述文件和Excel模板相结合的方法,对于有些报表会很复杂,特别是那些横向的报表,有时候会极其复杂,这时就需要现成的Excel模板,有了Excel模板我们就可以参照着模板来生成xml样式定义文件,在具体生成报表的时候,我们只要知道用到的Excel模版是哪个,XML样式文件是哪个,再绑上我们的数据,那么即使再复杂的报表也同样能简单生成了。
  具体使用,可参照如下测试用列代码(声明ExcelOperate,XmlOperate是我自己写的几个通用的组件,如有需要我可发邮件给你们,其中数据我是以DataTable的形式来描述的):
  using S
  using NUnit.F
  using ExcelO
  using XmlO
  using System.D
  using System.Data.SqlC
  namespace TestExcel
  /**//// &summary&
  /// &/summary&
  [TestFixture]
  public class ExcelExport
  [Test]
  public void Export()//不用Excel模板的数据导出
  string Sql ="Select top 100* from customers ";
  //取出100条数据
  ExcelFactory _factory = new ExcelFactory();
  //定义一个没有参数的ExcelFactory
  _factory.CreateExcelwithoutTemplate("c://bbbbbbb.xml",GetDataTable(Sql ));
  //载入定义的样式文件bbbbbbb.xml和刚取出来的数据GetDataTable(Sql )
  _factory.SaveExcel("c://bbbbbbbbbbbbbbbb.xls");
  //保存导出的文件即可
  [Test]
  public void ExportWithTemplate()//用到了Excel模版的数据导出
  string Sql ="Select top 1* from customers ";
  //取出一条数据
  ExcelFactory _factory = new ExcelFactory("c://QStandardCustomer.xls");
  //导入模版QStandardCustomer.xls
  _factory.CreateExcel("c://QStandardCustomer.xml",GetDataTable(Sql ));
  //载入定义的样式文件QStandadrCustomer.xml和刚取出来的数据GetDataTable(Sql )
  _factory.SaveExcel("c://Qreportstr.xls");
  //最后保存导出的Excel文件即可
  private DataTable GetDataTable(string Sql)
  string myConnectionString = "packet size=4096;user id=data source=172.28.200.98;initial catalog=Northwind";
  SqlConnection myConnection = new SqlConnection(myConnectionString);
  myConnection.Open();
  SqlDataAdapter myAdapter = new SqlDataAdapter();
  SqlCommand myCommand = new SqlCommand(Sql,myConnection);
  mandType = CommandType.T
  myAdapter.SelectCommand = myC
  DataSet ds = new DataSet();
  myAdapter.Fill(ds);
  myConnection.Close();
  return ds.Tables[0];
报表的样式,也就是哪个字段应该填在哪里,哪一列应该填什么,字体大小,颜色,单元格高度,宽度,单元格是否合并,是否跨行,是否跨列,是横向报表(所谓横向报表,我自定义为:一张Excel报表就是有一条记录或者有一条记录以及其关联记录而生成的报表,如一张订单报表通常就是有一个订单头和其相关的订单明细所生成,这个就是我自定义的横向报表)还是纵向报表(所谓纵向报表,我自定义为:一张报表就是有一个记录集所生成的,如要生成一张记录某个班级学生情况的报表,则要把这个班级的学生记录都要导出到这张报表中,这种报表基本上就是统计报表,一张报表可能会有几万条记录或者更多,这个就是我自定义的纵向报表)等等报表样式。
  2.报表的数据,对于我们而言有了报表样式,我们就知道在哪个或者哪几个单元格应该填哪些数据,具体的数据,我们则可以以DataTable的形式来表现,也可以以DataSet的形式来表现,至于用怎么样的数据格式可以随自己喜欢,自己来定义。
  现在我们知道了生成Excel报表只要有了样式和数据,就可以生成一张自己想要的报表了,数据的生成并不困难,但是我们的困难就是这个报表的样式用什么来描述,怎么来描述。
  对于样式的描述我们可以用下面方法来实现:
  直接用XML来描述,这个xml描述文件的主要描述的内容可以如下(举个列子说明一下,现在描述的还不是很规范):
  &?xml version="1.0" encoding="UTF-8"?&
  &Style&
  &ExcelStyle Sort="纵向" Space="1"&
  &Ranges&
  &RangeStyle&
  &Range CellWidth="2.0" CellHeight="20" CellBord="1" CellBackColor=""&&/Range&
  &TitleCell TitleName="部件编号" TitleStartxPos="1" TitleEndxPos="1" TitleStartyPos="1" TitleEndyPos="1"&&/TitleCell&
  &DataCell DataName="PartNo" DataStartxPos="2" DataEndxPos="14" DataStartyPos="34" DataEndyPos="34"IsMerger="False" Align="XlHAlign.xlHAlignLeft" IsToArray="True" IsDateTime="False" Interval="1"&
  &/DataCell&
  &TitleFont TitleFontName="宋体" TitleFontSize="9" TitleFontColor="Black" TitleFontBold="False" TitleFontItatic="False" TitleFontPosition="Center"& &/TitleFont&
  &DataFont DataFontName="宋体" DataFontSize="11" DataFontColor="Black" DataFontBold="True" DataFontItatic="False" DataFontHyperLink="False" DataFontPosition="Center"&
  &/DataFont&
  &/RangeStyle&
  &/Ranges&
  &/ExcelStyle&
  &/Style&
由上面代码可见,一般的报表生成都是三句代码,即使对于报表的某些行,某些格式要调整我们也不需要在去修改程序,只要改xml描述文件即可,这样就可以使我们大大的在报表的生成上来节省时间,而可以把更多的时间放在业务逻辑的处理上了。
这句总结很有用 用xml充当桥梁,对生成Excel 修改样式
,只改xml文档就可以了
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 用excel制作报表 的文章

 

随机推荐