无须安装Office读写Excel2007操作类库

时间:2008/12/26 10:39:23      阅读:10997     附件: excelpackagesamples.rar (经验值:10)     下载:81
      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进行介绍,没有对性能上进行什么改进,只用在俺的项目上的一些地方,下面给出实例,看看我生成的一个网上报名表代码:
1using System;
2using System.IO;
3using System.Xml;
4using OfficeOpenXml;
5using System.Data.SqlClient;
6
7namespace 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格式的代码,都是俺辛辛苦苦找来的,有兴趣的朋友可以下载试试,高手们要是可以改进其性能并提供代码,俺更加欢迎,有好东西记得给俺一份呵。
评论
  • Re:无须安装Office读写Excel2007操作类库  (2009/1/18 10:23:13) by 杜建壮 
    非常实用,可是附近在哪里下载
  • Re:无须安装Office读写Excel2007操作类库  (2009/2/27 10:50:56) by faint 
    非常感谢。。。。。
  • Re:无须安装Office读写Excel2007操作类库  (2009/2/27 17:35:11) by alliat 
    OPENXML确实是个好东西
  • Re:无须安装Office读写Excel2007操作类库  (2009/3/30 15:31:13) by aghlqp 
    非常感谢。。。。。
  • Re:无须安装Office读写Excel2007操作类库  (2009/5/28 10:15:53) by lijia7436 
       纠结啊~很需要~结果发现经验不够
  • Re:无须安装Office读写Excel2007操作类库  (2009/6/29 8:49:07) by yuhaijun 
    不错
  • Re:无须安装Office读写Excel2007操作类库  (2009/7/4 11:52:29) by Clarke 
    非常感谢博主的这文章,让我解决了不少难题,但是我现在又遇上了更加难的问题,希望博能帮我看看.
    1.单元格的设置:
        a.单元格边框线的显示及颜色
        b.单元格数据类型的设置,如:字体样式,大小,颜色
        c.单元格背景颜色的填充
        d.单元格的合并
    2.在当前Sheet中根据数据动态生成统计图
  • Re:无须安装Office读写Excel2007操作类库  (2009/8/3 12:51:04) by haoren999 

    学习了,非常感谢这文章

  • Re:无须安装Office读写Excel2007操作类库  (2009/9/16 17:38:23) by 阿貓 

    wow, cool , Is it need a excel template designed? and just use this to fill data in cell?

  • Re:无须安装Office读写Excel2007操作类库  (2009/9/17 17:58:33) by twt007 

    好东西,在用户装不了office时很有用。

  • Re:无须安装Office读写Excel2007操作类库  (2009/10/23 0:27:52) by 鏂囧浆 

    Office2007中的Excel,Word,PowedPoint使用了OpenXml文件格式,文件是一个标准的zip压缩包,只需要简单的将文件的扩展名更改为.zip,就能看到其内部的具体内容,大部分是标准的xml文件,所以类库主要的任务就是操作xml

  • Re:无须安装Office读写Excel2007操作类库  (2010/1/14 17:11:15) by PekingLin 

    OPENXML确实是个好东西,好好利用是不错

  • Re:无须安装Office读写Excel2007操作类库  (2010/1/15 11:11:18) by 寮犱笁浜?Url= 

    Office2007中的Excel,Word,PowedPoint使用了OpenXml文件格式

  • Re:无须安装Office读写Excel2007操作类库  (2010/1/28 15:28:13) by 赵剑英 

    尝试使用OPENXML。

  • Re:无须安装Office读写Excel2007操作类库  (2010/4/22 19:22:41) by 孙茂辉 

    是挺好的 

  • Re:无须安装Office读写Excel2007操作类库  (2010/5/17 8:43:51) by tomtao 

    <p>只能對office2007嗎? office2003的可以嗎?</p>

  • Re:无须安装Office读写Excel2007操作类库  (2010/6/6 13:47:38) by wxq1404 

    非常感谢。。。。。

  • Re:无须安装Office读写Excel2007操作类库  (2010/6/9 15:34:19) by seasd 

    极其需要!帮帮忙阿!

  • Re:无须安装Office读写Excel2007操作类库  (2010/6/10 9:35:47) by jianice 

    这个好,但不知能否输出2003格式?

    可能从原理上不行,因为2007和XML的关系

  • Re:无须安装Office读写Excel2007操作类库  (2010/6/19 13:58:56) by 鐜嬮箯 

    系统好像存在编码的问题。姓名变成乱码了。

  • Re:无须安装Office读写Excel2007操作类库  (2010/8/5 18:12:33) by 唐田 

    学习,同问:

    1.单元格的设置:

        a.单元格边框线的显示及颜色
        b.单元格数据类型的设置,如:字体样式,大小,颜色
        c.单元格背景颜色的填充
        d.单元格的合并
  • Re:无须安装Office读写Excel2007操作类库  (2010/8/6 22:00:08) by sxhoho 

    好像现在这样的库还挺多的.

  • Re:无须安装Office读写Excel2007操作类库  (2010/8/23 22:47:38) by 毛东东 

    <p>不错,可以看看</p>

  • Re:无须安装Office读写Excel2007操作类库  (2010/9/11 9:57:43) by CCJY2008 

    好好学习一下,好东东

  • Re:无须安装Office读写Excel2007操作类库  (2011/1/6 11:20:26) by feilang 

    这个好,但不知能否输出2003格式?

    可能从原理上不行,因为2007和XML的关系

  • Re:无须安装Office读写Excel2007操作类库  (2011/11/30 1:30:44) by aabbbei 

     非常感谢。

标 题:
 
姓 名:
 
主 页:

验证码:

评论:
 

Because of the cache,you may see your comments several minutes later.