永远的SKYFEI
喜欢在阳光下,光着脊梁,挥汗如雨地工作,每次回头擦汗,看到的都是成就!

Open XML 是从office 2007 开始被支持的, 用Open xml可以不用Office dcom创建标准office 文档, Office Dcom进程释放不掉, 实在太烦人了, 而且资源消耗大. 用Open xml可以直接生成office 文档, 不过现在文档资料比较少, 且方法不是很可取, 包括msdn上的一些文档, 创建office 文档都是用拼字符串的方法来做的, 个人感觉不符合C#编码习惯, 不过也情有可原, 这文档大多是在open xml sdk1.0 年代写的, 先Open xml SDK2.0出来了, 经过一阵专研, 终于写出了一个excel 文件,  不过可惜, boss 考虑到风险问题, 让我继续要dcom创建, 因此仅仅研究到创建excel 文件, 并往cell里写text. 不过这种方法对于asp.net 动态生成 excel 下载, 还是很有用途的, boss 要求的下载的excel 要求带chart的, 就是根据数据生成chart在下载的excel文件中, 因此那种直接response  girdview的方法不能满足要求.

闲话少叙, 看代码.

  • 用open xml 需要首先安装 open xml sdk,  并且在.net 3.0环境, 因为它需要用LINQ.
  • 添加DocumentFormat.OpenXml 引用
  • 使用名称空间:
  • using System.IO.Packaging;
    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Spreadsheet;

 

// 创建流, 如果用在asp.net下载, 可以用memorystream

FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite);

//创建spreadsheetDocument

using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Create(fs, SpreadsheetDocumentType.Workbook))
{

              WorkbookPart workbookPart = spreadSheet.AddWorkbookPart();
              workbookPart.Workbook = new Workbook();
              workbookPart.Workbook.AppendChild<Sheets>(new Sheets());

              //ShareString 不知道是做什么用, 没有找到相关文档介绍
               SharedStringTablePart sharestringTablePart = workbookPart.AddNewPart<SharedStringTablePart>();
               sharestringTablePart.SharedStringTable = new SharedStringTable();
               int i = 0;
               foreach (SharedStringItem item in sharestringTablePart.SharedStringTable.Elements<SharedStringItem>())
               {
                  string str =  item.InnerText;
                   i++;
               }
               sharestringTablePart.SharedStringTable.AppendChild(new SharedStringItem(new DocumentFormat.OpenXml.Spreadsheet.Text("teasfsdfasdfxt")));
              sharestringTablePart.SharedStringTable.Save();

              //SharedStringTable好像不起什么作用, 没有好像还不行

              //下边的代码是创建 sheet

               WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
               newWorksheetPart.Worksheet = new Worksheet(new SheetData());
               newWorksheetPart.Worksheet.Save();
               Sheets sheets = workbookPart.Workbook.GetFirstChild<Sheets>();
               string relationshipId = workbookPart.GetIdOfPart(newWorksheetPart);

               // Get a unique ID for the new sheet.
               uint sheetId = 1;

               string sheetName = "Sheet" + sheetId;

               // Append the new worksheet and associate it with the workbook.
               Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
               sheets.Append(sheet);

              //下边的代码是往sheet里写东西

               SheetData sheetData = newWorksheetPart.Worksheet.GetFirstChild<SheetData>();
               Row row = new Row(){RowIndex = 2};
               sheetData.Append(row);
               Cell newCell = new Cell() { CellReference = "B2" };
               newCell.DataType = new EnumValue<CellValues>(CellValues.String);
               row.InsertAt<Cell>(newCell, 0);
               newCell.CellValue = new CellValue("1");

               newCell.CellValue.Text = "testt";
               //这个保存很重要
               newWorksheetPart.Worksheet.Save();
               workbookPart.Workbook.Save();
              spreadSheet.Close();
              fs.Close();
          }

在创建的过程中一点错误就会导致创建的excel不能被打开. 另外有个外国公司已经封装了这个open xml, 很好用,很easy, 不过要钱. 网址: http://www.spreadsheetgear.com/ 

顺便发上我写用 exce Dcom 生成 excel

 

Code
posted on 2008-10-22 10:56  skyfei  阅读(3514)  评论(10编辑  收藏  举报