.net Create Excel 2007 file with open xml

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

 

ContractedBlock.gif ExpandedBlockStart.gif Code
  1using System;
  2using System.Data;
  3using System.Collections.Generic;
  4using System.Configuration;
  5using System.Web;
  6using System.Web.Security;
  7using System.Web.UI;
  8using System.Web.UI.HtmlControls;
  9using System.Web.UI.WebControls;
 10using System.Web.UI.WebControls.WebParts;
 11
 12using System.Drawing;
 13using Excel = Microsoft.Office.Interop.Excel;
 14using System.Windows.Forms;
 15namespace ExportToExcel
 16ExpandedBlockStart.gifContractedBlock.gif{
 17    public class ExcelHelper : IDisposable
 18ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 19        Excel.Application excel;
 20        Excel.Workbooks oBooks;
 21        Excel.Workbook workBook;
 22        Excel.Worksheet worksheet;
 23        List<object> dcoms = new List<object>();
 24ExpandedSubBlockStart.gifContractedSubBlock.gif        public Excel.Worksheet CurrentWorksheet get return worksheet; } }
 25        public ExcelHelper()
 26ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 27            
 28            excel = new Excel.Application();
 29            oBooks = excel.Workbooks;
 30            workBook = oBooks.Add(System.Reflection.Missing.Value);
 31            workBook.Application.Visible = false;
 32            //if (workBook.Worksheets.Count > 0)
 33            //   workBook.Worksheets[1] as Excel.Worksheet;
 34            worksheet = (Excel.Worksheet)excel.ActiveSheet;
 35
 36        }

 37
 38        public void SaveAs(string fileName)
 39ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 40            workBook.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive
 41            , Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
 42
 43            // excel.Save(fileName);
 44        }

 45        public void Dispose()
 46ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 47            foreach (object obj in dcoms)
 48ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 49                if(obj != null)
 50                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj);
 51            }

 52            dcoms.Clear();
 53            if (worksheet != null)
 54ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 55                System.Runtime.InteropServices.Marshal.FinalReleaseComObject((object)worksheet);
 56                worksheet = null;
 57            }

 58            if (workBook != null)
 59ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 60                workBook.Close(false, Type.Missing, Type.Missing);
 61               
 62                System.Runtime.InteropServices.Marshal.FinalReleaseComObject((object)workBook);
 63
 64                workBook = null;
 65            }

 66            if (oBooks != null)
 67ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 68                oBooks.Close();
 69                System.Runtime.InteropServices.Marshal.FinalReleaseComObject((object)oBooks);
 70                oBooks = null;
 71            }

 72            if (excel != null)
 73ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 74            
 75            
 76                excel.Quit();
 77          
 83                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excel);
 84                excel = null;
 85                
 86            }

 87
 88            GC.Collect(0);
 89        }

 90
 91        public void RangeTextAlign(string startCell, string endCell, Excel.XlHAlign hAlign, Excel.XlVAlign vAlign)
 92ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 93            Excel.Range range = worksheet.get_Range(startCell, endCell);
 94            range.HorizontalAlignment = hAlign;
 95            range.VerticalAlignment = vAlign;
 96
 97        }

 98
 99        public void RangeMerge(string startCell, string endCell, bool merge)
100ExpandedSubBlockStart.gifContractedSubBlock.gif        {
101            Excel.Range range = worksheet.get_Range(startCell, endCell);
102
103            if (merge)
104                range.Merge(true);
105            else
106                range.UnMerge();
107        }

108        public void RangeWrapText(string startCell, string endCell, bool wrapText)
109ExpandedSubBlockStart.gifContractedSubBlock.gif        {
110            Excel.Range range = worksheet.get_Range(startCell, endCell);
111
112            range.WrapText = wrapText;
113        }

114
115        public void WriteTextToRange(string startCell, string endCell, string text, bool merge, bool wrapText, Excel.XlHAlign hAlign, Excel.XlVAlign vAlign)
116ExpandedSubBlockStart.gifContractedSubBlock.gif        {
117           
118            Excel.Range range = worksheet.get_Range(startCell, endCell);
119            //int indexX, indexY;
120            //ConvertCellToIndex(startCell, out indexX, out indexY);
121            range.Cells[11= text;
122            
123            range.HorizontalAlignment = hAlign;
124            range.VerticalAlignment = vAlign;
125            if (merge)
126                range.Merge(true);
127            else
128                range.UnMerge();
129            range.WrapText = wrapText;
130        }

131        public void ConvertCellToIndex(string cellName, out int indexX, out int indexY)
132ExpandedSubBlockStart.gifContractedSubBlock.gif        {
133            indexX = cellName.ToUpper()[0]- 'A' +1;
134            indexY = cellName.ToUpper()[1- '0';
135        }

136        public string ConvertIndexToCellx(int indexX, int indexY)
137ExpandedSubBlockStart.gifContractedSubBlock.gif        {
138            char A = Convert.ToChar('A' + indexX - 1);
139            char B = Convert.ToChar('1' + indexY -1);
140            return A.ToString() + B;
141        }

142
143        public void WriteTableToExcelSheet(DataTable dt, bool writeHeader, int startX, int startY)
144ExpandedSubBlockStart.gifContractedSubBlock.gif        {
145            int i = 0, j = 0;
146            if (writeHeader)
147ExpandedSubBlockStart.gifContractedSubBlock.gif            {
148                foreach (DataColumn column in dt.Columns)
149ExpandedSubBlockStart.gifContractedSubBlock.gif                {
150                    worksheet.Cells[startX, startY + j] = column.Caption;
151                    ((Excel.Range)worksheet.Cells[startX, startY + j]).EntireColumn.AutoFit();
152                    j++;
153                }

154                i++;
155                
156            }

157            foreach (DataRow row in dt.Rows)
158ExpandedSubBlockStart.gifContractedSubBlock.gif            {
159                for (j = 0; j < dt.Columns.Count; j++)
160                    worksheet.Cells[startX + i, startY + j] = row[j];
161                i++;
162            }

163            string c1 = ConvertIndexToCellx(startX, startY);
164            string c2 = ConvertIndexToCellx(startX + dt.Columns.Count, startY + dt.Rows.Count);
165            Excel.Range range = worksheet.get_Range(c1, c2);
166            
167            range.EntireColumn.AutoFit();
168        }

169        public void SetRangeFont(string startDataCell, string endDataCell, bool isBold, bool isItalic, bool isOutlineFont, bool isShadow, Color color, double size)
170ExpandedSubBlockStart.gifContractedSubBlock.gif        {
171            Excel.Range cellRange = worksheet.get_Range(startDataCell, endDataCell);
172            cellRange.Font.Bold = isBold;
173            cellRange.Font.Italic = isItalic;
174            cellRange.Font.OutlineFont = isOutlineFont;
175            cellRange.Font.Shadow = isShadow;
176            cellRange.Font.Color = System.Drawing.ColorTranslator.ToOle(color);
177            cellRange.Font.Size = size;
178
179
180        }

181        public void SetRangeAutoFormat(string startDataCell, string endDataCell, Excel.XlRangeAutoFormat format)
182ExpandedSubBlockStart.gifContractedSubBlock.gif        {
183            Excel.Range cellRange = worksheet.get_Range(startDataCell, endDataCell);
184            cellRange.AutoFormat(format, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
185        }

186        public bool CreateChart(string startDataCell, string endDataCell, Excel.XlChartType chartType, string chartName, string Title, string categoryTitle, string valueTile)
187ExpandedSubBlockStart.gifContractedSubBlock.gif        {
188            try
189ExpandedSubBlockStart.gifContractedSubBlock.gif            {
190                Excel.Sheets charts = workBook.Charts;
191                Excel.Chart xlChart = (Excel.Chart)charts.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
192
193                dcoms.Add(charts);
194                dcoms.Add(xlChart);
195
196                Excel.Range cellRange = worksheet.get_Range(startDataCell, endDataCell);
197
198                xlChart.ChartWizard(cellRange, chartType, Type.Missing, Excel.XlRowCol.xlColumns, 10true, Title, categoryTitle, valueTile, "aaa");
199
200                xlChart.Name = chartName;
201
202                Excel.ChartGroup grp = (Excel.ChartGroup)xlChart.ChartGroups(1);
203                grp.GapWidth = 20;
204                grp.VaryByCategories = true;
205
206
207                Excel.Series s = (Excel.Series)grp.SeriesCollection(1);
208                s.BarShape = Excel.XlBarShape.xlCylinder;
209                s.HasDataLabels = true;
210
211                xlChart.Legend.Position = Excel.XlLegendPosition.xlLegendPositionTop;
212                xlChart.ChartTitle.Font.Size = 24;
213                xlChart.ChartTitle.Shadow = true;
214                xlChart.ChartTitle.Border.LineStyle = Excel.XlLineStyle.xlContinuous;
215
216                Excel.Axis valueAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlValue, Excel.XlAxisGroup.xlPrimary);
217                valueAxis.AxisTitle.Orientation = -90;
218                Excel.Axis categoryAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlCategory, Excel.XlAxisGroup.xlPrimary);
219                //categoryAxis.AxisTitle.Font.Name = "MS UI Gothic";
220                xlChart.Location(Microsoft.Office.Interop.Excel.XlChartLocation.xlLocationAutomatic, worksheet.Name);
221                return true;
222            }

223            catch (Exception ex)
224ExpandedSubBlockStart.gifContractedSubBlock.gif            {
225                throw new Exception(ex.Message);
226
227            }

228
229            return false;
230        }

231
232    }

233}

234

转载于:https://www.cnblogs.com/skyfei/archive/2008/10/22/1316560.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用第三方库来实现Excel转PDF,比如使用EPPlus和iTextSharp库。 EPPlus是一个用于读写Excel文件的.NET库,支持Excel2007及以上版本,可以读取和写入Excel文件,还支持将Excel文件转换为PDF。使用EPPlus库转换Excel文件时,需要先将Excel文件加载到内存中,然后再将其转换为PDF。 iTextSharp是一个用于生成PDF文档的.NET库,支持将HTML、XML、文本和图像等格式转换为PDF。使用iTextSharp库转换Excel文件时,需要将Excel文件转换为HTML格式,然后再使用iTextSharp将HTML转换为PDF。 以下是使用EPPlus库将Excel文件转换为PDF文件的示例代码: ```csharp using OfficeOpenXml; using System.IO; public void ConvertExcelToPdf(string excelFilePath, string pdfFilePath) { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 需要设置许可证上下文 using (var excelPackage = new ExcelPackage(new FileInfo(excelFilePath))) { var pdfStream = new MemoryStream(); excelPackage.SaveAs(pdfStream, ExcelPackage.ExcelType.Pdf); File.WriteAllBytes(pdfFilePath, pdfStream.ToArray()); } } ``` 以下是使用iTextSharp库将HTML文件转换为PDF文件的示例代码: ```csharp using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; public void ConvertHtmlToPdf(string htmlFilePath, string pdfFilePath) { using (var htmlStream = new FileStream(htmlFilePath, FileMode.Open, FileAccess.Read)) using (var pdfStream = new FileStream(pdfFilePath, FileMode.Create, FileAccess.Write)) { var document = new Document(); var writer = PdfWriter.GetInstance(document, pdfStream); document.Open(); XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, htmlStream, null, Encoding.UTF8); document.Close(); } } ``` 需要注意的是,使用第三方库进行Excel转PDF操作可能会存在一些兼容性问题,因此需要根据具体情况进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值