无须安装Office读写Excel2007操作类库
Office2007中的Excel,Word,PowedPoint使用了OpenXml文件格式,文件是一个标准的zip压缩包,只需要简单的将文件的扩展名更改为.zip,就能看到其内部的具体内容,大部分是标准的xml文件,所以类库主要的任务就是操作xml。
在这介绍一下Excel2007的操作类库目ExcelPackage,可以在没有安装Office的机器上快速读写和操作Excel2007格式文件,将之封装成可以结合报表数据分析工具的Excel2007报表生成工具,但是ExcelPackage内部的操作全部基于XmlDocument,效率低不怎么理想,生成简单的报表还不错,数据量大就不建议使用,基于XmlDocument的操作,涉及了XPath等操作都是基于文档的,许多XPath的查询都是需要遍历文档的,即使再怎么优化XPath也不能提高太多的效率。已经有高手修过此组件,把所有XML的操作都放到内存当中去做,把Excel文件中的XML文档内容映射到内存中的自定义对象,在操作完成后再将内存中的对象写回zip压缩包中去。这个思路重可以达到更高效率,编写这个类库的时候使用了System.IO.Packaging这个名称空间,该空间内提供了一些对zip文件的操作类,该空间位于WindowsBase.dll中,是一个.net3.x的库,其实还有一个可以实现和System.IO.Pacakaging类似功能的类库SharpZipLib,可以从已经安装了.net3.x的机器那拷贝WindwsBase.dll过来用,能顺利的在VS2005中引用且能正常使用。
俺这里的没有经过修改,只是对ExcelPackage进行介绍,没有对性能上进行什么改进,只用在俺的项目上的一些地方,下面给出实例,看看我生成的一个网上报名表代码:
1
using System;
2
using System.IO;
3
using System.Xml;
4
using OfficeOpenXml;
5
using System.Data.SqlClient;
6
7
namespace ExcelPackageSamples
8
...{
9
class Sample4
10
...{
11
/**//// <summary>
12
/// Sample 4 -使用模板创建一个工作簿
13
/// 从AdventureWorks数据库填充数据
14
/// 范例需要AdventureWorks数据库。
15
/// </summary>
16
/// <param name="outputDir">输出目录</param>
17
/// <param name="templateDir">模板目录</param>
18
/// <param name="connectionString">数据库连接字符串</param>
19
public static string RunSample4(DirectoryInfo outputDir, DirectoryInfo templateDir, string connectionString)
20
...{
21
22
// just check nobody is been an idiot here!
23
if (connectionString.IndexOf("YourServerName") > 0)
24
throw new Exception("You must edit the connection string to reference the correct server name!");
25
FileInfo newFile = new FileInfo(outputDir.FullName + @"\sample4.xlsx");
26
FileInfo template = new FileInfo(templateDir.FullName + @"\sample4template.xlsx");
27
if (!template.Exists) throw new Exception("Template file does not exist! i.e. sample4template.xlsx");
28
29
30
// ok, we can run the real code of the sample now
31
using (ExcelPackage xlPackage = new ExcelPackage(newFile, template))
32
...{
33
// uncomment this line if you want the XML written out to the outputDir
34
//xlPackage.DebugMode = true;
35
36
//得到要处理的已有工作表
37
ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets["报名表"];
38
if (worksheet != null)
39
...{
40
//连接到数据库的取出数据
41
using (SqlConnection sqlConn = new SqlConnection(connectionString))
42
...{
43
sqlConn.Open();
44
SqlCommand sqlCmd = new SqlCommand("select Name,Sex,Birth,JG,MZ,HYZK,WHCD,JKZK,ZZMM,HJSZD,IDCard,ZGorZC,WYorJSJ,GZDW,CJGZSJ,ZWZC,TXDZ,YZBM,LXDH,GRJL,JCQK from SyDw_BM WHERE BMID=2", sqlConn);
45
SqlDataReader sqlReader = sqlCmd.ExecuteReader();
46
sqlReader.Read();
47
48
worksheet.Cell(4, 3).Value = sqlReader.GetValue(0).ToString();//姓名
49
worksheet.Cell(4, 7).Value = sqlReader.GetValue(1).ToString();//性别
50
worksheet.Cell(4, 9).Value = sqlReader.GetValue(2).ToString();//出生日期
51
worksheet.Cell(5, 3).Value = sqlReader.GetValue(3).ToString();//籍贯
52
worksheet.Cell(5, 7).Value = sqlReader.GetValue(4).ToString();//民族
53
worksheet.Cell(5, 9).Value = sqlReader.GetValue(5).ToString();//婚姻状况
54
worksheet.Cell(6, 3).Value = sqlReader.GetValue(6).ToString();//文化程度
55
worksheet.Cell(6, 7).Value = sqlReader.GetValue(7).ToString();//健康状况
56
worksheet.Cell(6, 9).Value = sqlReader.GetValue(8).ToString();//政治面貌
57
worksheet.Cell(7, 3).Value = sqlReader.GetValue(9).ToString();//户籍所在地
58
worksheet.Cell(7, 8).Value = "\n" + sqlReader.GetValue(10).ToString(); //身份证号码
59
60
worksheet.Cell(9, 9).Value = sqlReader.GetValue(11).ToString();//有何从(执)业资格证或专长
61
worksheet.Cell(9, 11).Value = sqlReader.GetValue(12).ToString();//外语及计算机等级
62
63
worksheet.Cell(11, 3).Value = sqlReader.GetValue(13).ToString();//工作单位
64
worksheet.Cell(11, 7).Value = sqlReader.GetValue(14).ToString();//参加工作时间
65
worksheet.Cell(11, 9).Value = sqlReader.GetValue(15).ToString();//职务职称
66
worksheet.Cell(12, 3).Value = sqlReader.GetValue(16).ToString();//通讯地址
67
worksheet.Cell(12, 7).Value = sqlReader.GetValue(17).ToString();//邮政编码
68
worksheet.Cell(12, 9).Value = "\n" + sqlReader.GetValue(18).ToString();//联系电话
69
worksheet.Cell(13, 3).Value = sqlReader.GetValue(19).ToString();//个人简历
70
worksheet.Cell(14, 3).Value = sqlReader.GetValue(19).ToString();//奖惩情况
71
72
sqlReader.Close();
73
sqlConn.Close();
74
}
75
76
//设置自定义页眉文字
77
//worksheet.HeaderFooter.oddHeader.CenteredText = "报名表";
78
//在页脚添加页码和总页数
79
//worksheet.HeaderFooter.oddFooter.RightAlignedText =string.Format("第 {0} 页,共 {1} 页", ExcelHeaderFooter.PageNumber, ExcelHeaderFooter.NumberOfPages);
80
//在页脚中间新增的工作表名称
81
//worksheet.HeaderFooter.oddFooter.CenteredText = ExcelHeaderFooter.SheetName;
82
//在页脚左边新增的文件路径
83
//worksheet.HeaderFooter.oddFooter.LeftAlignedText = ExcelHeaderFooter.FilePath + ExcelHeaderFooter.FileName;
84
85
//改变显示模式:true为 页面布局,false为 普通模式
86
//worksheet.View.PageLayoutView = true;
87
}
88
89
//添加生成的电子表格的文件属性
90
91
//设置一些核心属性
92
xlPackage.Workbook.Properties.Title = "Sample 1"; //标题
93
xlPackage.Workbook.Properties.Author = "Web3"; //作者
94
xlPackage.Workbook.Properties.Subject = "ExcelPackage Samples"; //主题
95
xlPackage.Workbook.Properties.Keywords = "Office Open XML"; //关键字
96
xlPackage.Workbook.Properties.Category = "ExcelPackage Samples"; //类别
97
//备注
98
xlPackage.Workbook.Properties.Comments = "用Packaging API和Office Open XML创建一个Excel 2007文件";
99
100
//设置一些扩展属性值
101
xlPackage.Workbook.Properties.Company = "Web3 Inc.";
102
xlPackage.Workbook.Properties.HyperlinkBase = new Uri("http://www.Web3.cn");
103
104
//设置一些自定义属性值
105
xlPackage.Workbook.Properties.SetCustomPropertyValue("Checked by", "John Tunnicliffe");
106
xlPackage.Workbook.Properties.SetCustomPropertyValue("EmployeeID", "1147");
107
xlPackage.Workbook.Properties.SetCustomPropertyValue("AssemblyName", "ExcelPackage");
108
109
//保存完成!
110
xlPackage.Save();
111
}
112
113
// if you want to take a look at the XML created in the package, simply uncomment the following lines
114
// These copy the output file and give it a zip extension so you can open it and take a look!
115
//FileInfo zipFile = new FileInfo(outputDir.FullName + @"\sample3.zip");
116
//if (zipFile.Exists) zipFile.Delete();
117
//newFile.CopyTo(zipFile.FullName);
118
119
return newFile.FullName;
120
}
121
}
122
}
123
生成效果:
附件包附带ASP.NET生成DOCX格式的代码,都是俺辛辛苦苦找来的,有兴趣的朋友可以下载试试,高手们要是可以改进其性能并提供代码,俺更加欢迎,有好东西记得给俺一份呵。