C# .Net Web开发中导入Excel到数据库,使用NPOI2支持2003、2007、2010等更高版本

周五花了半天时间搞一个OA里面的Excel报表导入,使用的是吉日嘎拉的GPM架构,但是发现其DotNet.Utilities中的Excel导入类,只能支持Office2003、2007版本,对于2010版本就不支持了,通过搜索[URL=http://code.google.com/p/npoi/]NPOI官方[/URL]文档,终于找到了解决办法,可以不用再担心用户Excel文件版本的问题了。以下2篇文章起到很大作用,特别感谢Tony Qu搞出来这么好的组件。

1、《[URL=http://tonyqus.sinaapp.com/archives/575]NPOI 2教程–1.2 NPOI 2.0模块简介[/URL]》
2、《[URL=http://tonyqus.sinaapp.com/archives/482]NPOI 2.0教程 – 自动识别Excel 2003或2007格式[/URL]》

修改到的文件代码如下,请注意升级NPOI到2的版本,同时请手工添加多个dll引用,貌似1的版本只需要引用一个文件,而2的版本需要应用4个(NPOI.dll, NPOI.OOXML.dll, NPOI.OpenXml4Net.dll, ICSharpCode.SharpZipLib.dll)。

<br/>        /// <summary><br/>        /// 读取Excel<br/>        /// 默认第一行为标头<br/>        /// 支持Office 2007以上版本<br/>        /// 替换原先的方式,不存在非托管方式无法释放资源的问题<br/>        /// 适用于B/S C/S。服务器可免安装Office。<br/>        /// Pcsky 2012.05.01<br/>        /// </summary><br/>        /// <param name="path">excel文档路径</param><br/>        /// <returns></returns><br/>        public static DataTable ImportExcel(string path, int sheetIndex = 0 )<br/>        {<br/>            string columnName;<br/>            var dt = new DataTable();<br/>            //HSSFWorkbook wb;<br/>            IWorkbook wb;<br/>            using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))<br/>            {<br/>                // 只支持2007及以下低版本<br/>                //wb = new HSSFWorkbook(file);<br/>                // 通过接口的方式实现从xls到xlsx 2003、2007以上版本的全部支持<br/>                wb = WorkbookFactory.Create(file);<br/><br/>            }<br/>            ISheet sheet = wb.GetSheetAt(sheetIndex);<br/>            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();<br/>            IRow headerRow = sheet.GetRow(0);<br/>            int cellCount = headerRow.LastCellNum;<br/><br/>            // 添加datatable的标题行<br/><br/><br/>            //for (int i = 0; i < cellCount; i++)<br/>            for (int i = headerRow.FirstCellNum; i < cellCount; i++)<br/>            {<br/>                //ICell cell = headerRow.GetCell(j);<br/>                //dt.Columns.Add(cell.ToString());<br/><br/>                // 2012.09.13 Pcsky 处理空列<br/>                if (headerRow.GetCell(i) == null)<br/>                {<br/>                    columnName = Guid.NewGuid().ToString();<br/>                }<br/>                else<br/>                {<br/>                    columnName = headerRow.GetCell(i).StringCellValue;<br/>                }<br/>                DataColumn column = new DataColumn(columnName);<br/>                dt.Columns.Add(column);<br/>            }<br/><br/>            // 从第2行起添加内容行<br/>            for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)<br/>            {<br/>                IRow row = sheet.GetRow(i);<br/>                DataRow dr = dt.NewRow();<br/><br/>                // 2012.09.12 Pcsky 设置dataRow的索引号从0开始<br/>                int k = 0;<br/>                for (int j = row.FirstCellNum; j < cellCount; j++)<br/>                {<br/>      &nb
sp;             //if (row.GetCell(j) != null)<br/>                    //{<br/>                    //dataRow[j] = row.GetCell(j).ToString();<br/><br/>                    dr[k] = row.GetCell(j);<br/>                    k++;<br/>                    //}<br/>                }<br/><br/>                dt.Rows.Add(dr);<br/>            }<br/>            wb = null;<br/>            sheet = null;<br/>            return dt;<br/>        }<br/>

现在想想:满足了一下用户的需求,盯了一天的电脑,同事说我眼睛都红了,而内心还挺高兴,也许这就是工作的乐趣、编程的乐趣吧,当然了,坏处就是一旦有啥东西搞不定,就会很沮丧,而影响心情和生活。我们都是凡人,没办法。

Loading

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据