C# 使用NPOI 导出Excel
NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作
下面介绍下NPOI操作Excel的方法
首先我们需要下载NPOI的程序集
下载地址 http://npoi.codeplex.com/releases
我下载下来是有这两个文件
这里使用的是net4.0
将下面几个dll添加到项目中并引用
废话不多说 上代码
- /// <summary>
- /// create 2016-11-30 by sly
- /// 将DataTable数据导入到excel中 此方法直接返回文件给浏览器下载
- /// </summary>
- /// <param name="data">要导入的数据</param>
- /// <param name="isColumnWritten">DataTable的列名是否要导入</param>
- /// <param name="sheetName">要导入的excel的sheet的名称</param>
- /// <param name="widthDic">要设置的宽度(key 列下标,val 宽度大小)</param>
- /// <returns></returns>
- public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten, Dictionary<int, int> widthDic = null)
- {
- int i = ;
- int j = ;
- int count = ;
- ISheet sheet = null;
- MemoryStream file = new MemoryStream();
- if (fileName.IndexOf(".xlsx") > ) //2007版本
- workbook = new XSSFWorkbook();
- else
- if (fileName.IndexOf(".xls") > ) // 2003版本
- workbook = new HSSFWorkbook();
- try
- {
- if (workbook != null)
- {
- sheet = workbook.CreateSheet(sheetName);
- //设置所有列宽
- for (int l = ; l <= data.Rows.Count; l++)
- {
- sheet.DefaultColumnWidth = ;
- }
- if (widthDic != null)
- {
- //设定自定义宽度
- foreach (var item in widthDic)
- {
- sheet.SetColumnWidth(item.Key, item.Value);
- }
- }
- }
- else
- {
- return -;
- }
- if (isColumnWritten == true) //写入DataTable的列名
- {
- IRow row = sheet.CreateRow();
- for (j = ; j < data.Columns.Count; ++j)
- {
- row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
- }
- count = ;
- }
- else
- {
- count = ;
- }
- int outRes = -;
- for (i = ; i < data.Rows.Count; ++i)
- {
- IRow row = sheet.CreateRow(count);
- for (j = ; j < data.Columns.Count; ++j)
- {
- if (int.TryParse(data.Rows[i][j].ToString(), out outRes))
- {
- row.CreateCell(j).SetCellValue(Convert.ToInt32(data.Rows[i][j].ToString()));
- }
- else
- {
- if (!string.IsNullOrEmpty(data.Rows[i][j].ToString()) && data.Rows[i][j].ToString().Length > )
- {
- if ((data.Rows[i][j].ToString().Substring(, ) == "http://" || data.Rows[i][j].ToString().Substring(, ) == "https://"))
- {
- var TCell = row.CreateCell(j);
- HSSFHyperlink link = new HSSFHyperlink(HyperlinkType.Url);//建一个HSSFHyperlink实体,指明链接类型为URL
- TCell.SetCellValue(data.Rows[i][j].ToString());
- link.Address = data.Rows[i][j].ToString();//给HSSFHyperlink的地址赋值
- TCell.Hyperlink = link;
- }
- else
- {
- row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
- }
- }
- else
- {
- row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
- }
- }
- }
- ++count;
- }
- workbook.Write(file); //写入到excel
- var context = System.Web.HttpContext.Current;
- context.Response.ContentType = "application/vnd.ms-excel";
- context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
- context.Response.Clear();
- context.Response.BinaryWrite(file.GetBuffer());
- context.Response.End();
- return count;
- }
- catch (Exception ex)
- {
- return -;
- }
- }
- /// <summary>
- /// 将excel中的数据导入到DataTable中
- /// </summary>
- /// <param name="sheetName">excel工作薄sheet的名称</param>
- /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
- /// <returns></returns>
- public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
- {
- ISheet sheet = null;
- DataTable data = new DataTable();
- int startRow = ;
- try
- {
- fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
- if (fileName.IndexOf(".xlsx") > ) // 2007版本
- workbook = new XSSFWorkbook(fs);
- else
- if (fileName.IndexOf(".xls") > ) // 2003版本
- workbook = new HSSFWorkbook(fs);
- if (sheetName != null)
- {
- sheet = workbook.GetSheet(sheetName);
- if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
- {
- sheet = workbook.GetSheetAt();
- }
- }
- else
- {
- sheet = workbook.GetSheetAt();
- }
- if (sheet != null)
- {
- IRow firstRow = sheet.GetRow();
- int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数
- if (isFirstRowColumn)
- {
- for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
- {
- ICell cell = firstRow.GetCell(i);
- if (cell != null)
- {
- string cellValue = cell.StringCellValue;
- if (cellValue != null)
- {
- DataColumn column = new DataColumn(cellValue);
- data.Columns.Add(column);
- }
- }
- }
- startRow = sheet.FirstRowNum + ;
- }
- else
- {
- startRow = sheet.FirstRowNum;
- }
- //最后一列的标号
- int rowCount = sheet.LastRowNum;
- for (int i = startRow; i <= rowCount; ++i)
- {
- IRow row = sheet.GetRow(i);
- if (row == null) continue; //没有数据的行默认是null
- DataRow dataRow = data.NewRow();
- for (int j = row.FirstCellNum; j < cellCount; ++j)
- {
- if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
- dataRow[j] = row.GetCell(j).ToString();
- }
- data.Rows.Add(dataRow);
- }
- }
- return data;
- }
- catch (Exception ex)
- {
- return null;
- }
- }
- /// <summary>
- /// 合并单元格
- /// </summary>
- /// <param name="sheet">要合并单元格所在的sheet</param>
- /// <param name="rowstart">开始行的索引</param>
- /// <param name="rowend">结束行的索引</param>
- /// <param name="colstart">开始列的索引</param>
- /// <param name="colend">结束列的索引</param>
- public static void SetCellRangeAddress(ISheet sheet, int rowstart, int rowend, int colstart, int colend)
- {
- CellRangeAddress cellRangeAddress = new CellRangeAddress(rowstart, rowend, colstart, colend);
- sheet.AddMergedRegion(cellRangeAddress);
- }
- //调用导出方法
- new Helper.ExcelHelper("导出的文件名.xls").DataTableToExcel(dt, "sheet1", true, null);
- new Helper.ExcelHelper("导出的文件名.xlsx").DataTableToExcel(dt, "sheet1", true, null);
下面是导入
- <input type="file" name="fileField" class="file" id="fileField" value="导入" style="display: none;" />
- <script>
- $("#fileField").live("change", function () {
- var Reg = new RegExp("^.+\.(xls)");
- var Reg2 = new RegExp("^.+\.(xlsx)");
- if (Reg.test($(this).val()) || Reg.test2($(this).val())) {
- ImportGrade();//此处调用后台导入方法,这里就不写了哈
- } else {
- $.IvanDialogOpen({ "Type": "tips", "Info": "仅支持 .xls ,.xlsx 文件", "Plugins": { CloseTime: 800 } });
- }
- })
- </script>
- /// <summary>
- /// 导入Demo
- /// </summary>
- /// <param name="filePath"></param>
- /// <returns></returns>
- public ActionResult ImportGrade(string filePath)
- {
- //获取文件在服务器上的路径
- string path = string.Concat(FileUpload.GetFilePath(UploadType.ImportGradeFile), filePath);
- //根据上传路径获取表格数据
- ExcelHelper eh = new ExcelHelper(path.Replace("\\", "/"));
- DataTable dt = eh.ExcelToDataTable("Sheet1", true);
- return Content("");
- }
以上就是NPOI的简单使用方法
C# 使用NPOI 导出Excel的更多相关文章
- NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters
/******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...
- Asp.Net 使用Npoi导出Excel
引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...
- NPOI导出EXCEL 打印设置分页及打印标题
在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方法,但一直都没有起到作用.经过研究是要设置 sheet1.FitToPage = false; 而 ...
- .NET NPOI导出Excel详解
NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...
- NPOI导出Excel(含有超过65335的处理情况)
NPOI导出Excel的网上有很多,正好自己遇到就学习并总结了一下: 首先说明几点: 1.Excel2003及一下:后缀xls,单个sheet最大行数为65335 Excel2007 单个sheet ...
- [转]NPOI导出EXCEL 打印设置分页及打印标题
本文转自:http://www.cnblogs.com/Gyoung/p/4483475.html 在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方 ...
- 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限
大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...
- 用NPOI导出Excel
用NPOI导出Excel public void ProcessRequest(HttpContext context) { context.Response.ContentType = " ...
- NPOI导出Excel示例
摘要:使用开源程序NPOI导出Excel示例.NPOI首页地址:http://npoi.codeplex.com/,NPOI示例博客:http://tonyqus.sinaapp.com/. 示例编写 ...
- NPOI导出excel(带图片)
近期项目中用到Excel导出功能,之前都是用普通的office组件导出的方法,今天尝试用下NPOI,故作此文以备日后查阅. 1.NPOI官网http://npoi.codeplex.com/,下载最新 ...
随机推荐
- java开发3轮技术面+hr面 面经(MT)
一直没打理博客园 发现博客园阅读量好大,就把前段时间写的一个面经也搬过来咯,大家一起加油.... 作者:小仇Eleven 链接:https://www.nowcoder.com/discuss/37 ...
- 最近找java实习面试被问到的东西总结(Java方向)
时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻 ...
- 第4阶段——制作根文件系统之编译配置安装busybox(3)
在上一节分析出制作一个最小的根文件系统至少需要: (1)/dev/console(终端控制台, 提供标准输入.标准输出以及标准错误) /dev/null (为空的话就是/dev/null, 所有写到 ...
- 设置SQL Server 2005数据库使之可以远程连接
1. 开启sql2005远程连接功能,开启办法如下: 配置工具->SQL Server外围应用配置器->服务和连接的外围应用配置器->打开MSSQLSERVER节点下的Databas ...
- jQuery学习目录
前面的话 目前来说,jQuery可能已经不再处于人们的话题中心.人们讨论的更多的是Vue.Angular和React.但是,jQuery的使用量依然广泛,据统计,它仍然是目前使用率最高的javascr ...
- 第02周-Java作业评价
1. 本周作业简评与建议 作业存在的问题 格式上还是存在问题,但是比较第一次有很大的进步. 答题上,有的同学还是很敷衍,题目要求有分析过程,但是只写一个false,true,没有分析.也比较缺少自己的 ...
- 201521123103 《Java学习笔记》 第八周学习总结
一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 集合部分:TreeMap实现类:对键值进行排序. Map的entrySet Set<Map.Entry&l ...
- 201521123059 《Java程序设计》第七周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 Q1: ArrayList代码分析 1.1 解释ArrayList的contains ...
- 201521123117 《Java程序设计》第7周学习总结
1. 本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.解释ArrayList的contains源代码 源代码: //contains()方法 public boolean conta ...
- 201521123104《JAVA程序设计》第三周学习总结
1. 本周学习总结 2. 书面作业 Q1. 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...