NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作

下面介绍下NPOI操作Excel的方法

首先我们需要下载NPOI的程序集

下载地址 http://npoi.codeplex.com/releases

我下载下来是有这两个文件

这里使用的是net4.0

将下面几个dll添加到项目中并引用

废话不多说  上代码

  1. /// <summary>
  2. /// create 2016-11-30 by sly
  3. /// 将DataTable数据导入到excel中 此方法直接返回文件给浏览器下载
  4. /// </summary>
  5. /// <param name="data">要导入的数据</param>
  6. /// <param name="isColumnWritten">DataTable的列名是否要导入</param>
  7. /// <param name="sheetName">要导入的excel的sheet的名称</param>
  8. /// <param name="widthDic">要设置的宽度(key 列下标,val 宽度大小)</param>
  9. /// <returns></returns>
  10. public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten, Dictionary<int, int> widthDic = null)
  11. {
  12. int i = ;
  13. int j = ;
  14. int count = ;
  15. ISheet sheet = null;
  16.  
  17. MemoryStream file = new MemoryStream();
  18.  
  19. if (fileName.IndexOf(".xlsx") > ) //2007版本
  20. workbook = new XSSFWorkbook();
  21. else
  22. if (fileName.IndexOf(".xls") > ) // 2003版本
  23. workbook = new HSSFWorkbook();
  24.  
  25. try
  26. {
  27. if (workbook != null)
  28. {
  29. sheet = workbook.CreateSheet(sheetName);
  30.  
  31. //设置所有列宽
  32. for (int l = ; l <= data.Rows.Count; l++)
  33. {
  34. sheet.DefaultColumnWidth = ;
  35. }
  36.  
  37. if (widthDic != null)
  38. {
  39. //设定自定义宽度
  40. foreach (var item in widthDic)
  41. {
  42. sheet.SetColumnWidth(item.Key, item.Value);
  43. }
  44. }
  45. }
  46. else
  47. {
  48. return -;
  49. }
  50.  
  51. if (isColumnWritten == true) //写入DataTable的列名
  52. {
  53. IRow row = sheet.CreateRow();
  54. for (j = ; j < data.Columns.Count; ++j)
  55. {
  56. row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
  57. }
  58. count = ;
  59. }
  60. else
  61. {
  62. count = ;
  63. }
  64. int outRes = -;
  65.  
  66. for (i = ; i < data.Rows.Count; ++i)
  67. {
  68. IRow row = sheet.CreateRow(count);
  69. for (j = ; j < data.Columns.Count; ++j)
  70. {
  71. if (int.TryParse(data.Rows[i][j].ToString(), out outRes))
  72. {
  73. row.CreateCell(j).SetCellValue(Convert.ToInt32(data.Rows[i][j].ToString()));
  74. }
  75. else
  76. {
  77. if (!string.IsNullOrEmpty(data.Rows[i][j].ToString()) && data.Rows[i][j].ToString().Length > )
  78. {
  79. if ((data.Rows[i][j].ToString().Substring(, ) == "http://" || data.Rows[i][j].ToString().Substring(, ) == "https://"))
  80. {
  81. var TCell = row.CreateCell(j);
  82. HSSFHyperlink link = new HSSFHyperlink(HyperlinkType.Url);//建一个HSSFHyperlink实体,指明链接类型为URL
  83. TCell.SetCellValue(data.Rows[i][j].ToString());
  84. link.Address = data.Rows[i][j].ToString();//给HSSFHyperlink的地址赋值
  85. TCell.Hyperlink = link;
  86. }
  87. else
  88. {
  89. row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
  90. }
  91. }
  92. else
  93. {
  94. row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
  95. }
  96. }
  97. }
  98. ++count;
  99. }
  100. workbook.Write(file); //写入到excel
  101.  
  102. var context = System.Web.HttpContext.Current;
  103. context.Response.ContentType = "application/vnd.ms-excel";
  104. context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
  105. context.Response.Clear();
  106. context.Response.BinaryWrite(file.GetBuffer());
  107. context.Response.End();
  108.  
  109. return count;
  110. }
  111. catch (Exception ex)
  112. {
  113. return -;
  114. }
  115. }
  1. /// <summary>
  2. /// 将excel中的数据导入到DataTable中
  3. /// </summary>
  4. /// <param name="sheetName">excel工作薄sheet的名称</param>
  5. /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
  6. /// <returns></returns>
  7. public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
  8. {
  9. ISheet sheet = null;
  10. DataTable data = new DataTable();
  11. int startRow = ;
  12. try
  13. {
  14. fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
  15. if (fileName.IndexOf(".xlsx") > ) // 2007版本
  16. workbook = new XSSFWorkbook(fs);
  17. else
  18. if (fileName.IndexOf(".xls") > ) // 2003版本
  19. workbook = new HSSFWorkbook(fs);
  20.  
  21. if (sheetName != null)
  22. {
  23. sheet = workbook.GetSheet(sheetName);
  24. if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
  25. {
  26. sheet = workbook.GetSheetAt();
  27. }
  28. }
  29. else
  30. {
  31. sheet = workbook.GetSheetAt();
  32. }
  33. if (sheet != null)
  34. {
  35. IRow firstRow = sheet.GetRow();
  36. int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数
  37.  
  38. if (isFirstRowColumn)
  39. {
  40. for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
  41. {
  42. ICell cell = firstRow.GetCell(i);
  43. if (cell != null)
  44. {
  45. string cellValue = cell.StringCellValue;
  46. if (cellValue != null)
  47. {
  48. DataColumn column = new DataColumn(cellValue);
  49. data.Columns.Add(column);
  50. }
  51. }
  52. }
  53. startRow = sheet.FirstRowNum + ;
  54. }
  55. else
  56. {
  57. startRow = sheet.FirstRowNum;
  58. }
  59.  
  60. //最后一列的标号
  61. int rowCount = sheet.LastRowNum;
  62. for (int i = startRow; i <= rowCount; ++i)
  63. {
  64. IRow row = sheet.GetRow(i);
  65. if (row == null) continue; //没有数据的行默认是null       
  66.  
  67. DataRow dataRow = data.NewRow();
  68. for (int j = row.FirstCellNum; j < cellCount; ++j)
  69. {
  70. if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
  71. dataRow[j] = row.GetCell(j).ToString();
  72. }
  73. data.Rows.Add(dataRow);
  74. }
  75. }
  76.  
  77. return data;
  78. }
  79. catch (Exception ex)
  80. {
  81. return null;
  82. }
  83. }
  1. /// <summary>
  2. /// 合并单元格
  3. /// </summary>
  4. /// <param name="sheet">要合并单元格所在的sheet</param>
  5. /// <param name="rowstart">开始行的索引</param>
  6. /// <param name="rowend">结束行的索引</param>
  7. /// <param name="colstart">开始列的索引</param>
  8. /// <param name="colend">结束列的索引</param>
  9. public static void SetCellRangeAddress(ISheet sheet, int rowstart, int rowend, int colstart, int colend)
  10. {
  11. CellRangeAddress cellRangeAddress = new CellRangeAddress(rowstart, rowend, colstart, colend);
  12. sheet.AddMergedRegion(cellRangeAddress);
  13. }
  1. //调用导出方法
  2. new Helper.ExcelHelper("导出的文件名.xls").DataTableToExcel(dt, "sheet1", true, null);
  3. new Helper.ExcelHelper("导出的文件名.xlsx").DataTableToExcel(dt, "sheet1", true, null);

下面是导入

  1. <input type="file" name="fileField" class="file" id="fileField" value="导入" style="display: none;" />
  2. <script>
  3. $("#fileField").live("change", function () {
  4. var Reg = new RegExp("^.+\.(xls)");
  5. var Reg2 = new RegExp("^.+\.(xlsx)");
  6. if (Reg.test($(this).val()) || Reg.test2($(this).val())) {
  7. ImportGrade();//此处调用后台导入方法,这里就不写了哈
  8. } else {
  9. $.IvanDialogOpen({ "Type": "tips", "Info": "仅支持 .xls ,.xlsx 文件", "Plugins": { CloseTime: 800 } });
  10. }
  11. })
  12. </script>
  1. /// <summary>
  2. /// 导入Demo
  3. /// </summary>
  4. /// <param name="filePath"></param>
  5. /// <returns></returns>
  6. public ActionResult ImportGrade(string filePath)
  7. {
  8. //获取文件在服务器上的路径
  9. string path = string.Concat(FileUpload.GetFilePath(UploadType.ImportGradeFile), filePath);
  10. //根据上传路径获取表格数据
  11. ExcelHelper eh = new ExcelHelper(path.Replace("\\", "/"));
  12.  
  13. DataTable dt = eh.ExcelToDataTable("Sheet1", true);
  14.  
  15. return Content("");
  16. }

以上就是NPOI的简单使用方法

C# 使用NPOI 导出Excel的更多相关文章

  1. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  2. Asp.Net 使用Npoi导出Excel

    引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...

  3. NPOI导出EXCEL 打印设置分页及打印标题

    在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方法,但一直都没有起到作用.经过研究是要设置  sheet1.FitToPage = false; 而 ...

  4. .NET NPOI导出Excel详解

    NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...

  5. NPOI导出Excel(含有超过65335的处理情况)

    NPOI导出Excel的网上有很多,正好自己遇到就学习并总结了一下: 首先说明几点: 1.Excel2003及一下:后缀xls,单个sheet最大行数为65335 Excel2007 单个sheet ...

  6. [转]NPOI导出EXCEL 打印设置分页及打印标题

    本文转自:http://www.cnblogs.com/Gyoung/p/4483475.html 在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方 ...

  7. 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限

    大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...

  8. 用NPOI导出Excel

    用NPOI导出Excel public void ProcessRequest(HttpContext context) { context.Response.ContentType = " ...

  9. NPOI导出Excel示例

    摘要:使用开源程序NPOI导出Excel示例.NPOI首页地址:http://npoi.codeplex.com/,NPOI示例博客:http://tonyqus.sinaapp.com/. 示例编写 ...

  10. NPOI导出excel(带图片)

    近期项目中用到Excel导出功能,之前都是用普通的office组件导出的方法,今天尝试用下NPOI,故作此文以备日后查阅. 1.NPOI官网http://npoi.codeplex.com/,下载最新 ...

随机推荐

  1. java开发3轮技术面+hr面 面经(MT)

    一直没打理博客园  发现博客园阅读量好大,就把前段时间写的一个面经也搬过来咯,大家一起加油.... 作者:小仇Eleven 链接:https://www.nowcoder.com/discuss/37 ...

  2. 最近找java实习面试被问到的东西总结(Java方向)

    时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻 ...

  3. 第4阶段——制作根文件系统之编译配置安装busybox(3)

    在上一节分析出制作一个最小的根文件系统至少需要: (1)/dev/console(终端控制台, 提供标准输入.标准输出以及标准错误) /dev/null  (为空的话就是/dev/null, 所有写到 ...

  4. 设置SQL Server 2005数据库使之可以远程连接

    1. 开启sql2005远程连接功能,开启办法如下: 配置工具->SQL Server外围应用配置器->服务和连接的外围应用配置器->打开MSSQLSERVER节点下的Databas ...

  5. jQuery学习目录

    前面的话 目前来说,jQuery可能已经不再处于人们的话题中心.人们讨论的更多的是Vue.Angular和React.但是,jQuery的使用量依然广泛,据统计,它仍然是目前使用率最高的javascr ...

  6. 第02周-Java作业评价

    1. 本周作业简评与建议 作业存在的问题 格式上还是存在问题,但是比较第一次有很大的进步. 答题上,有的同学还是很敷衍,题目要求有分析过程,但是只写一个false,true,没有分析.也比较缺少自己的 ...

  7. 201521123103 《Java学习笔记》 第八周学习总结

    一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 集合部分:TreeMap实现类:对键值进行排序. Map的entrySet Set<Map.Entry&l ...

  8. 201521123059 《Java程序设计》第七周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 Q1: ArrayList代码分析 1.1 解释ArrayList的contains ...

  9. 201521123117 《Java程序设计》第7周学习总结

    1. 本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.解释ArrayList的contains源代码 源代码: //contains()方法 public boolean conta ...

  10. 201521123104《JAVA程序设计》第三周学习总结

    1. 本周学习总结 2. 书面作业 Q1. 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...