本文共 4494 字,大约阅读时间需要 14 分钟。
1.使用场景:
在不安装Office组件包的情况下,操作Excel文件(.xlsx)。以前做过的好几个项目中,都需要对Excel文件处理,特别是将统计成果按照一定的格式和样式输出到Excel中,或将固定格式的Excel数据导入到系统,这种需求非常常见,以前的做法主要是基于Office组件进行二次开发。但这种做法存在一定的缺陷,(1) 部署比较麻烦,所有的部署机上都必须安装Office。(2)好多新手在使用Office开发时,对自动生成的office组件包装类理解不深,导致在项目移植的过程中引起了很多的问题。
2.EPPlus库的使用:
EPPlus是一个能不依赖于Office而独立读写操作Excel2007/2010的.net类库,主要是操作Excel的xlsx文件。
官方下载地址:http://epplus.codeplex.com/
EPPlus提供的功能包括:
Cell Ranges 单元格范围
Cell Styling 单元格样式,包括:边框、颜色、填充、字体、显示格式(Number)、靠边。
Charts 统计图表
Picture 图片
Shapes
Comments
Tables 表格
Protection 协议
Encryption 加密
Pivot Tables透视表
Conditional Formatting、VBA、Enumeration Of Cell 支持Linq。等。
2.应用实例
注意:在使用之前必须添加两个引用,这两个命名空间都在EPPlus.dll库中。
using OfficeOpenXml;
using OfficeOpenXml.Style;(1)【写】这是项目中用到的创建一个.xlsx文件,并将统计结果到处到此.xlsx文件中。
/// <summary>
/// 统计信息输出到excel文件中,创建本地缓存。 /// </summary> /// <param name="singleDataTable">单程</param> /// <param name="doubleTable">往返</param> /// <returns>ture,false</returns> private bool ExportToExcel(DataTable singleDataTable, DataTable doubleTable) { ExcelPackage excelPackage = new ExcelPackage(); #region 单程 ExcelWorksheet single_Sheet = excelPackage.Workbook.Worksheets.Add("single_Sheet"); single_Sheet.Name = "单程航班"; single_Sheet.Cells.Style.Font.Size = 9; single_Sheet.Cells.Style.Font.Name = "微软雅黑"; single_Sheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Left; int columsCount = singleDataTable.Columns.Count; int rowIndex = 0; ++rowIndex; //在worksheet中添加新行 for (int i = 0; i < columsCount; i++) { single_Sheet.Cells[rowIndex, i + 1].Value = singleDataTable.Columns[i].ColumnName; single_Sheet.Cells[rowIndex, i + 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; single_Sheet.Cells[rowIndex, i + 1].Style.Font.Bold = true; } ++rowIndex;//excel第一行用来存储表格头,从第二行开始存储数据。 for (int i = 0; i < singleDataTable.Rows.Count; i++) { for (int j = 0; j < columsCount; j++) { single_Sheet.Cells[rowIndex + i, j + 1].Value = singleDataTable.Rows[i][j].ToString(); } } #endregion #region 往返 ExcelWorksheet double_Sheet = excelPackage.Workbook.Worksheets.Add("double_Sheet"); double_Sheet.Name = "往返航班"; double_Sheet.Cells.Style.Font.Size = 9; double_Sheet.Cells.Style.Font.Name = "微软雅黑"; double_Sheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Left; rowIndex = 0; ++rowIndex; //在worksheet中添加新行 for (int i = 0; i < columsCount; i++) { double_Sheet.Cells[rowIndex, i + 1].Value = doubleTable.Columns[i].ColumnName; double_Sheet.Cells[rowIndex, i + 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; double_Sheet.Cells[rowIndex, i + 1].Style.Font.Bold = true; } ++rowIndex; for (int i = 0; i < doubleTable.Rows.Count; i++) { for (int j = 0; j < columsCount; j++) { double_Sheet.Cells[rowIndex + i, j + 1].Value = doubleTable.Rows[i][j].ToString(); } } #endregion #region 输出到执行目录 try { this.cacheFileName = string.Format("航线查询明细日报v{0}.xlsx", DateTime.Now.ToString("yyyyMMddHHmmssfff")); if (Directory.Exists(cacheDirectory) == false) { Directory.CreateDirectory(cacheDirectory); } string fullpath = cacheDirectory + this.cacheFileName; FileStream fileStream = new FileStream(fullpath, FileMode.Create); using (fileStream) { byte[] fileBytes = excelPackage.GetAsByteArray(); fileStream.Write(fileBytes, 0, fileBytes.Length); fileStream.Close(); } } catch { return false; } return true; #endregion }(2) 【读】读取.xslx的文件。
/// <summary>
/// 将统计结果发送到指定邮箱。 /// </summary> /// <returns></returns> private bool SendEmail() { ExcelPackage excelPackage = new ExcelPackage(new FileInfo(this.cacheDirectory + this.cacheFileName)); string mailMessagaBodyToHtml = ConvertExcelToHtml(excelPackage.Workbook.Worksheets); string smtpClientHost=@"mail.ly.com"; string networkCredentialName="my08567"; string networkCredentialPassword= @"123qwe!@#"; string fromMailAddress="my08567@ly.com"; string toMailAddress="mymhj@live.com;my08567@live.com;yyy07386@ly.com"; string duplicateMailAddress="mwm07215@ly.com;mymhj@live.com"; string subject="航线查询日报表"; string body=ConvertExcelToHtml(excelPackage.Workbook.Worksheets); bool isHtml=true; MemoryStream attachmentSteam= new MemoryStream(excelPackage.GetAsByteArray());; string attachmentFileName = DateTime.Today.ToString("yyyyMMdd") + "航线查询明细日报.xlsx"; try { SendEmailHelper.SendEMailNet(smtpClientHost, networkCredentialName, networkCredentialPassword, fromMailAddress, toMailAddress, duplicateMailAddress, subject, body, isHtml, attachmentSteam, attachmentFileName); return true; } catch { return false; } }
在网上搜集的过程中,还发现对Excel文件格式的操作,还有一下几个开源组件可以使用ExcelLibrary,NPOI等。
转载地址:http://notqj.baihongyu.com/