码迷,mamicode.com
首页 > 其他好文 > 详细

初探:使用NPOI导出Excel(已有Excel模板)

时间:2014-09-03 18:09:47      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:c#   excel   npoi   模板   

最近在写个功能,要导出Excel到本地,第一次使用的方法是用office COM组件Microsoft.Office.Intertrop.Excel.dll,在我的机器上功能好用,但放到一个同事的机器上,始终会出现一个问题:“COM类工厂。。。没有注册”的bug,首先尝试的方法是修改Excel application的权限,但以失败告终。


在网上查到一个方法是,使用第三方的链接库,我选择了NPOI,一个开源的,下载地址:http://npoi.codeplex.com/releases, 里面有demo可以参考学习。


下面把我在实际中用到的贴出来:

首先我有一个Excel模板,所以要做的工作就是打开模板,填充数据。

程序如下:


/// <summary>
        /// 应用开源NPOI,导出Excel
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNPOIExport_Click(object sender, EventArgs e)
        {
            if (!File.Exists(sExePath + "NPOI.dll"))
            {
                MessageBox.Show("导出所需动态链接库NPOI.dll不存在,不支持导出。", "提示");
                return;
            }
            if (!File.Exists(sExePath + sExcelName))
            {
                MessageBox.Show("DataUsageReportingFileSample.xls模板文件不存在,请确认与.EXE同路径下包含此文件。", "提示");
                return;
            }

            // 填充数据
            using (SaveFileDialog saveExcel = new SaveFileDialog())
            {
                saveExcel.Filter = "Excel文件 (*.xls)|*.xls";
                string sNewFileName = string.Empty;
                if (saveExcel.ShowDialog() == DialogResult.OK)
                {
                    sNewFileName = saveExcel.FileName;
                    // 文件已被打开,则提示关闭
                    if (CFileHasOpened.FileHasOpen(sNewFileName))
                    {
                        MessageBox.Show("文件已被打开,请关闭后再重试保存。", "提示");
                        return;
                    }
                    // 复制模板,以后的操作都在复制的文件上进行
                    File.Copy(sExePath + sExcelName, sNewFileName, true);

                    InitializeWorkbook(sNewFileName);
                    if (null == hssfworkbook)
                    { return; }
                    ISheet modelSheet = hssfworkbook.GetSheet("Market Data Usage");
                    // 单元格格式
                    ICellStyle CenterStyle = hssfworkbook.CreateCellStyle();
                    CenterStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;

                    if (null == modelSheet)
                    { return; }
                    if (null == QueriedPermissions)
                    { return; }

                    for (Int32 rowIndex = 0; rowIndex < QueriedPermissions.Count; rowIndex++)
                    {
                        IRow tmpRow = modelSheet.GetRow(rowIndex + 5);
                        if (null == tmpRow)
                        { continue; }
                        for (Int32 colIndex = 0; colIndex < QueriedPermissions[rowIndex].Count; colIndex++)
                        {
                            ICell tmpCell = tmpRow.GetCell(colIndex);
                            if (null == tmpCell)
                            { continue; }
                            if (colIndex < 7)
                            {
                                tmpCell.SetCellValue(QueriedPermissions[rowIndex][colIndex].ToString().Trim());
                            }
                            else
                            {
                                tmpCell.SetCellValue(Convert.ToInt32(QueriedPermissions[rowIndex][colIndex].ToString().Trim()));
                                //tmpCell.CellStyle = CenterStyle;
                            }
                        }
                    }

                    //Force excel to recalculate all the formula while open
                    modelSheet.ForceFormulaRecalculation = true;

                    WriteToExcelWithNPOI(sNewFileName);
                }
            }
        }

        private static HSSFWorkbook hssfworkbook;
        /// <summary>
        /// 初始化工作簿
        /// </summary>
        private void InitializeWorkbook(string sNewFileName)
        {
            FileStream file = new FileStream(sNewFileName, FileMode.Open, FileAccess.Read);
            if (null == file)
            { return; }
            hssfworkbook = new HSSFWorkbook(file);
            if (null == hssfworkbook)
            { return; }
            //create a entry of DocumentSummaryInformation
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "test";
            hssfworkbook.DocumentSummaryInformation = dsi;

            //create a entry of SummaryInformation
            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Subject = "test";
            hssfworkbook.SummaryInformation = si;
        }

        /// <summary>
        /// 把工作簿写到本地文件
        /// </summary>
        private void WriteToExcelWithNPOI(string sNewFileName)
        {
            FileStream file = new FileStream(sNewFileName, FileMode.Create);
            hssfworkbook.Write(file);
            file.Close();
        }


这样导出Excel功能就不会依赖有没有装offic以及版本。

参考:http://www.cnblogs.com/lwme/archive/2011/11/18/npoi_excel_import_export.html


初探:使用NPOI导出Excel(已有Excel模板)

标签:c#   excel   npoi   模板   

原文地址:http://blog.csdn.net/gjban/article/details/39030669

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!