Excel导入及导出问题产生:

  从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类。以下是时不时就会出现的问题:
导出问题:
  如果是asp.net,你得在服务器端装Office,几百M呢,还得及时更新它,以防漏洞,还得设定权限允许ASP.net访问COM+,听说如果导出过程中出问题可能导致服务器宕机。
  Excel会把只包含数字的列进行类型转换,本来是文本型的,它非要把你转成数值型的,像身份证后三位变成000,编号000123会变成123,够智能吧,够郁闷吧。不过这些都还是可以变通解决的,在他们前边加上一个字母,让他们不只包含数字。
  导出时,如果你的字段内容以"-"或"="开头,Excel好像把它当成了公式什么的,接下来就出错,提示:类似,保存到Sheet1的问题
导入问题:
  Excel会根据你的
Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为你这一列就是数值型的,然后,身份证,手机,编号都转吧变成类似这样的
1.42702E+17格式,日期列变成
包含日期和数字的,乱的很,可以通过改注册表让Excel分析整个表,但如果整列都是数字,那这个问题还是解决不了。
  以上问题,一般人初次做时肯定得上网查查吧,一个问题接着另一个问题,查到你郁郁而死,还有很多问题没解决,最终感觉已经解决的不错了,但还不能保证某一天还会出个什么问题。

使用第三方开源组件导入及导出Excel的解决方案:

  偶然间发现了NPOI与MyXls,相见恨晚,害的我在Excel上浪费了那么多时间,他们俩的好处是:就是.net的自定义类库,可以直
接对Excel进行读或写,而不依赖Office 的
Excel,这不管对于ASP.net或Winform都非常有利,不用担心Excel进程的释放问题,服务器安全,设置,导出,导入“Excel智能识
别”,公式日期等问题,可以说以前的Excel问题,全都不用管了,它们可以很好的帮你解决,NPOI || MyXls == 研究几年Excel。
  NPOI开源地址:http://npoi.codeplex.com/
  MyXls开源地址:http://sourceforge.net/projects/myxls/

参考地址:

NPOI导出Excel表功能实现(多个工作簿):http://www.cnblogs.com/zhengjuzhuan/archive/2010/02/01/1661103.html
在 Server 端存取 Excel 檔案的利器:NPOI Library:http://msdn.microsoft.com/zh-tw/ee818993.aspx

  1. public class NPOIHelper
  2. {
  3. /// <summary>
  4. /// DataTable导出到Excel文件,winform
  5. /// </summary>
  6. /// <param name="dtSource">源DataTable</param>
  7. /// <param name="strHeaderText">表头文本</param>
  8. /// <param name="strFileName">保存位置</param>
  9. public static void Export(DataTable dtSource, string strHeaderText, string strFileName)
  10. {
  11. using (MemoryStream ms = Export(dtSource, strHeaderText))
  12. {
  13. using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
  14. {
  15. byte[] data = ms.ToArray();
  16. fs.Write(data, , data.Length);
  17. fs.Flush();
  18. }
  19. }
  20. }
  21.  
  22. /// <summary>
  23. /// DataTable导出到Excel的MemoryStream
  24. /// </summary>
  25. /// <param name="dtSource">源DataTable</param>
  26. /// <param name="strHeaderText">表头文本</param>
  27. public static MemoryStream Export(DataTable dtSource, string strHeaderText)
  28. {
  29. HSSFWorkbook workbook = new HSSFWorkbook();
  30. HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
  31.  
  32. HSSFCellStyle dateStyle = (HSSFCellStyle)workbook.CreateCellStyle();
  33. HSSFDataFormat format = (HSSFDataFormat)workbook.CreateDataFormat();
  34. dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
  35.  
  36. //取得列宽
  37. int[] arrColWidth = new int[dtSource.Columns.Count];
  38. foreach (DataColumn item in dtSource.Columns)
  39. {
  40. arrColWidth[item.Ordinal] = Encoding.GetEncoding().GetBytes(item.ColumnName.ToString()).Length;
  41. }
  42. ; i < dtSource.Rows.Count; i++)
  43. {
  44. ; j < dtSource.Columns.Count; j++)
  45. {
  46. ).GetBytes(dtSource.Rows[i][j].ToString()).Length;
  47. if (intTemp > arrColWidth[j])
  48. {
  49. arrColWidth[j] = intTemp;
  50. }
  51. }
  52. }
  53.  
  54. ;
  55. foreach (DataRow row in dtSource.Rows)
  56. {
  57. #region 新建表,填充表头,填充列头,样式
  58. || rowIndex == )
  59. {
  60. )
  61. {
  62. sheet = (HSSFSheet)workbook.CreateSheet();
  63. }
  64.  
  65. #region 表头及样式
  66. {
  67. HSSFRow headerRow = (HSSFRow)sheet.CreateRow();
  68. headerRow.HeightInPoints = ;
  69. headerRow.CreateCell().SetCellValue(strHeaderText);
  70.  
  71. HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
  72. headStyle.Alignment = HorizontalAlignment.Center;
  73. HSSFFont font = (HSSFFont)workbook.CreateFont();
  74. font.FontHeightInPoints = ;
  75. font.Boldweight = ;
  76. headStyle.SetFont(font);
  77. headerRow.GetCell().CellStyle = headStyle;
  78. sheet.AddMergedRegion(, , , dtSource.Columns.Count - ));
  79.  
  80. }
  81. #endregion
  82.  
  83. #region 列头及样式
  84. {
  85. HSSFRow headerRow = (HSSFRow)sheet.CreateRow();
  86. HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
  87. headStyle.Alignment = HorizontalAlignment.Center;
  88. HSSFFont font = (HSSFFont)workbook.CreateFont();
  89. font.FontHeightInPoints = ;
  90. font.Boldweight = ;
  91. headStyle.SetFont(font);
  92. foreach (DataColumn column in dtSource.Columns)
  93. {
  94. headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
  95. headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
  96.  
  97. //设置列宽
  98. sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + ) * );
  99. }
  100.  
  101. }
  102. #endregion
  103.  
  104. rowIndex = ;
  105. }
  106. #endregion
  107.  
  108. #region 填充内容
  109. HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
  110. foreach (DataColumn column in dtSource.Columns)
  111. {
  112. HSSFCell newCell = (HSSFCell)dataRow.CreateCell(column.Ordinal);
  113.  
  114. string drValue = row[column].ToString();
  115.  
  116. switch (column.DataType.ToString())
  117. {
  118. case "System.String"://字符串类型
  119. newCell.SetCellValue(drValue);
  120. break;
  121. case "System.DateTime"://日期类型
  122. DateTime dateV;
  123. DateTime.TryParse(drValue, out dateV);
  124. newCell.SetCellValue(dateV);
  125.  
  126. newCell.CellStyle = dateStyle;//格式化显示
  127. break;
  128. case "System.Boolean"://布尔型
  129. bool boolV = false;
  130. bool.TryParse(drValue, out boolV);
  131. newCell.SetCellValue(boolV);
  132. break;
  133. case "System.Int16"://整型
  134. case "System.Int32":
  135. case "System.Int64":
  136. case "System.Byte":
  137. ;
  138. int.TryParse(drValue, out intV);
  139. newCell.SetCellValue(intV);
  140. break;
  141. case "System.Decimal"://浮点型
  142. case "System.Double":
  143. ;
  144. double.TryParse(drValue, out doubV);
  145. newCell.SetCellValue(doubV);
  146. break;
  147. case "System.DBNull"://空值处理
  148. newCell.SetCellValue("");
  149. break;
  150. default:
  151. newCell.SetCellValue("");
  152. break;
  153. }
  154.  
  155. }
  156. #endregion
  157.  
  158. rowIndex++;
  159. }
  160.  
  161. #region 合并相同列不成功
  162. ////合并列相同的
  163. //int columnCount = 0; //记录sheet一行的总列数
  164. //int start = 0;
  165. //int end = 0;
  166. //string cellText = "";
  167. //string temp = "";
  168. //for (int i = 0; i < workbook.NumberOfSheets; i++) //NumberOfSheets是xls中总共的表数
  169. //{
  170. // ISheet sht = workbook.GetSheetAt(i); //读取当前表数据
  171.  
  172. // columnCount = sht.GetRow(3).LastCellNum;
  173.  
  174. // for (int j = 0; j <= columnCount; j++)
  175. // {
  176. // for (int k = 2; k < sheet.LastRowNum; k++) //
  177. // {
  178. // ICell icell = sht.GetRow(k).GetCell(j);
  179. // if (icell != null)
  180. // {
  181. // cellText = icell.ToString();//获取单元格的值
  182.  
  183. // if ((k + 1) <= sht.LastRowNum) //比较当前列下一行单元格的值
  184. // {
  185. // IRow iRow = sht.GetRow(k + 1);
  186. // if (iRow != null)
  187. // {
  188. // temp = iRow.GetCell(j).ToString();
  189.  
  190. // if (cellText == temp) //如果列上下值相同
  191. // {
  192. // //start = k; //给开始的行号
  193. // //end = k + 1;
  194. // CellRangeAddress region = new CellRangeAddress(k, k + 1, j, j); //四个参数为:起始行,结束行,起始列,结束列
  195. // sht.AddMergedRegion(region);
  196. // }
  197. // //else //列上下值不相同
  198. // //{
  199. // // CellRangeAddress region = new CellRangeAddress(start,j , end, j);
  200. // // sht.AddMergedRegion(region);
  201. // // //合并之后重新给cellText赋值
  202. // //}
  203. // }
  204.  
  205. // }
  206. // }
  207.  
  208. // }
  209. // }
  210. //}
  211.  
  212. #endregion
  213.  
  214. using (MemoryStream ms = new MemoryStream())
  215. {
  216. workbook.Write(ms);
  217. ms.Flush();
  218. ms.Position = ;
  219.  
  220. //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
  221. return ms;
  222. }
  223. }
  224.  
  225. /// <summary>
  226. /// 用于Web导出
  227. /// </summary>
  228. /// <param name="dtSource">源DataTable</param>
  229. /// <param name="strHeaderText">表头文本</param>
  230. /// <param name="strFileName">文件名</param>
  231. public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName)
  232. {
  233. HttpContext curContext = HttpContext.Current;
  234.  
  235. // 设置编码和附件格式
  236. curContext.Response.ContentType = "application/vnd.ms-excel";
  237. curContext.Response.ContentEncoding = Encoding.UTF8;
  238. curContext.Response.Charset = "";
  239. curContext.Response.AppendHeader("Content-Disposition",
  240. "attachment;filename=" + strFileName);
  241.  
  242. curContext.Response.BinaryWrite(Export(dtSource, strHeaderText).GetBuffer());
  243. curContext.Response.End();
  244. }
  245.  
  246. /// <summary>读取excel
  247. /// 默认第一行为标头
  248. /// </summary>
  249. /// <param name="strFileName">excel文档路径</param>
  250. /// <returns></returns>
  251. public static DataTable Import(string strFileName)
  252. {
  253. DataTable dt = new DataTable();
  254.  
  255. HSSFWorkbook hssfworkbook;
  256. using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
  257. {
  258. hssfworkbook = new HSSFWorkbook(file);
  259. }
  260. HSSFSheet sheet = (HSSFSheet)hssfworkbook.GetSheetAt();
  261. System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
  262.  
  263. HSSFRow headerRow = (HSSFRow)sheet.GetRow();
  264. int cellCount = headerRow.LastCellNum;
  265.  
  266. ; j < cellCount; j++)
  267. {
  268. HSSFCell cell = (HSSFCell)headerRow.GetCell(j);
  269. dt.Columns.Add(cell.ToString());
  270. }
  271.  
  272. ); i <= sheet.LastRowNum; i++)
  273. {
  274. HSSFRow row = (HSSFRow)sheet.GetRow(i);
  275. DataRow dataRow = dt.NewRow();
  276.  
  277. for (int j = row.FirstCellNum; j < cellCount; j++)
  278. {
  279. if (row.GetCell(j) != null)
  280. dataRow[j] = row.GetCell(j).ToString();
  281. }
  282.  
  283. dt.Rows.Add(dataRow);
  284. }
  285. return dt;
  286. }
  287. }

本文参考并使用转自的博文地址:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.html

NPOI通过DataTable导出和读取Excel的更多相关文章

  1. 使用NPOI导出,读取EXCEL(可追加功能)

    使用NPOI导出,读取EXCEL,具有可追加功能 看代码 using System; using System.Collections.Generic; using System.Text; usin ...

  2. java导出和读取excel数据

    使用的是poi的jar包 下载地址http://poi.apache.org/download.html 主要是把jar包导入,直接新建一个列子测试一下就明白了.使用起来还是比较方便的,代码里面的原理 ...

  3. datatable导出到Word / Excel / PDF / HTML .NET

    原文发布时间为:2011-01-21 -- 来源于本人的百度文章 [由搬家工具导入] IEnumerable - DataTable Export to Word / Excel / PDF / HT ...

  4. NPOI使用Datatable导出到Excel

    首先要引用dll 下载地址:http://pan.baidu.com/s/1dFr2m 引入命名空间: using NPOI.HSSF.UserModel;using NPOI.SS.UserMode ...

  5. Npoi List DataTable导出一个Excel多个sheet 下载

    参考: http://blog.csdn.net/zhouqinghe24/article/details/8649346 参考下载http://www.cnblogs.com/dyllove98/a ...

  6. DataTable导出为word,excel,html,csv,pdf,.txt

    using System; using System.Data; using System.Configuration; using System.Collections; using System. ...

  7. c#使用aspose.cells 从datatable导出数据到excel

    string json=value.Value; DataTable dt=Utils.JsonDataTableConvert.ToDataTable(json); string fileName ...

  8. asp.net 使用NPOI读取excel文件

    asp.net 使用NPOI读取excel文件内容 NPOI下载地址:NPOI public class ExcelHelper { /// <summary> /// 读取Excel文件 ...

  9. c#(NPOI)DataTable导出execl,execl(支持解析公式)导入DataTable

    NPOI(C#)DataTable导出execl using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserMod ...

随机推荐

  1. 解决mdi窗体闪烁的问题

    /// 解决mdi窗体闪烁的问题 /// </summary> protected override CreateParams CreateParams { get { CreatePar ...

  2. poj1159 dp(滚动数组优化)

    H - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:3000MS     Memory Limit:65536KB     ...

  3. 医院设置 codevs 2577

    Floyd+二叉树 #include<iostream>#include<cstdlib>#include<cstdio>#include<cstring&g ...

  4. python爬虫下载youtube单个视频

    __author__ = 'Sentinel'import requestsimport reimport jsonimport sysimport shutilimport urlparse &qu ...

  5. Modified Kaprekar Numbers

    Link: https://www.hackerrank.com/challenges/kaprekar-numbers from __future__ import print_function d ...

  6. Maven+SpringMVC+Mybatis 开发环境整合

    1.maven build遇到了如下问题:  [ERROR] Failed to execute goal org.codehaus.mojo:tomcat-maven-plugin:1.1:rede ...

  7. 再谈Redirect(客户端重定向)和Dispatch(服务器端重定向)

    这是两个常常被放在一起进行比较的概念,今天对这两个概念再重新回顾一下,前者发生在客户端(浏览器),后者发生在服务器端,因此也有人把前者称为客户端重定向,把后者称为服务器端重定向,虽然对于后者这种称谓并 ...

  8. pcduino通过USB方式刷机

    最近买了块pcduino来玩,一开始也不知道怎么入手使用,就想先学着网上来刷机,可以用TF卡来刷机,也可以用U盘来刷机.由于手上只有优盘,所以采用了第二种方式.具体方法参考了网上. 本文非原创,原文来 ...

  9. getResources().getXml()获取xml

    获取XML文件的基本思路是,通过getResources().getXml()获的XML原始文件,得到XmlResourceParser对象,通过该对象来判断是文档的开头还是结尾,是某个标签的开始还是 ...

  10. linux type 命令和Linux的五个查找命令

    type命令用来显示指定命令的类型.一个命令的类型可以是如下之一 alias 别名 keyword 关键字,Shell保留字 function 函数,Shell函数 builtin 内建命令,Shel ...