不安装Office操作Excel文件(.xlsx)

时间:2022-06-18 11:44:25

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等。