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