.NET——NPOI操作excel
一、引言
C#操作excel的方法大概有这几种:
1、采用OleDB读取EXCEL文件,把EXCEL文件当做一个数据源来进行数据的读取操作
2、引用的com组件:Microsoft.Office.Interop.Excel.dll 读取EXCEL文件
3、将EXCEL文件转化成CSV(逗号分隔)的文件,用文件流读取(等价就是读取一个txt文本文件)
不过这些方法都比较老套了,现在很多都用NPOI进行开发。NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件。在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx。官网提供了一份 Examples,给出了很多应用场景的例子,打包好的二进制文件类库,也仅有几MB,使用非常方便。
为啥使用它呢,优点:开源免费;不用安装office;不断更新团队强大。
ExcelHelper类放到最后了,可以直接使用==
二、WebAPI接受上传excel文件,并打开存入数据库(excel读取)
1、前台代码
用于上传文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../lib/jquery/jquery-3.1.0.min.js"></script>
</head>
<body>
<label for="fileUpload">选择文件
</label>
<br/>
<input id="fileUpload" type="file" multiple="multiple"/>
<input id="btnUploadFile" type="button" value="上传文件"/>
<hr/>s<progress id="uploadprogress" max="100" value="0">0</progress>
<script>$(function() {$("#btnUploadFile").on("click", function () {var data = new FormData();var files = $("#fileUpload").get(0).files;data.append("name", "xcy");data.append("file", files[0]);$.ajax({type: "post",url: "http://localhost:27110/Region/uploadFile",contentType: false,cache: false,currentType: false,processData: false,data: data,error: function (xhr, ajaxOptions, thrownError) {alert(xhr.responseText);alert(thrownError);},xhr: function () {var xhr = new window.XMLHttpRequest();//Download progressxhr.addEventListener("progress", function (evt) {console.log(evt.lengthComputable);if (evt.lengthComputable) {var percentComplete = evt.loaded / evt.total;$("progress").val(evt.loaded);}}, false);return xhr;},beforeSend: function () {$('#loading').show();},complete: function () {$("#loading").hide();},success: function (json) {$("#data").html("data receieved");}});});});
</script>
</body>
</html>
上传文件预览
2、后台WebAPI接收
controller类
/// <summary>/// 读取上传文件,存入数据库/// </summary>/// <returns></returns>[HttpPost]public IHttpActionResult uploadFile(){HttpFileCollection files = HttpContext.Current.Request.Files;RegionDAL regionDAL = new RegionDAL();Callback callback = new Callback();//try{callback.status = 1;callback.msg = "success";callback.data = regionDAL.uploadFile(files);}catch (Exception e){callback.status = 0;callback.msg = e.Message;}return Ok(callback);}
DAL类(这里存数据库的时候分段存的,每100条数据一存储;只存储了前两列的数据)
public object uploadFile(HttpFileCollection files){string prepath = "C:/Users/xcy/Desktop/";添加评估文件string filename;string savepath;foreach (string key in files.AllKeys){HttpPostedFile file = files[key];//判断文件是否为空if (file.ContentLength > 0){filename = Guid.NewGuid().ToString() + "$" + file.FileName;savepath = prepath + filename;file.SaveAs(savepath);HSSFWorkbook hssfworkbook;using (FileStream filestream = new FileStream(savepath, FileMode.Open, FileAccess.Read)){hssfworkbook = new HSSFWorkbook(filestream);}ISheet sheet = hssfworkbook.GetSheetAt(0);DataTable dt = ExcelHelper.RenderDataTableFromExcel(hssfworkbook, sheet.SheetName, 0);//string prefix = "insert into a (F_CODE,F_NAME) values";StringBuilder sb = new StringBuilder();int count = dt.Rows.Count;//总数int row = (count / 100) + 1;//分组数for (int i = 0; i < row ; i++){int temp = 100;if (i == row-1){temp = count % 100;}for (int j = 0; j < temp; j++){string code = dt.Rows[(i * 100) + j]["F_CODE"].ToString();string name = dt.Rows[(i * 100) + j]["F_NAME"].ToString();sb.Append("('" + code + "','" + name + "'),");}String sql = prefix + sb.Remove(sb.Length - 1, 1);SQLHelper.ExcuteSQL(sql);sb = new StringBuilder();}}else{return "不能上传空文件";}}return 1;}
数据库结果查看
三、WebAPI接受上传excel文件,并打开另存为excel(excel读取,excel保存)
1、前台代码
用于上传文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../lib/jquery/jquery-3.1.0.min.js"></script>
</head>
<body>
<label for="fileUpload">选择文件
</label>
<br/>
<input id="fileUpload" type="file" multiple="multiple"/>
<input id="btnUploadFile" type="button" value="上传文件"/>
<hr/><progress id="uploadprogress" max="100" value="0">0</progress>
<script>$(function() {$("#btnUploadFile").on("click", function () {var data = new FormData();var files = $("#fileUpload").get(0).files;data.append("name", "xcy");data.append("file", files[0]);$.ajax({type: "post",url: "http://localhost:27110/Region/createNewfile",contentType: false,cache: false,currentType: false,processData: false,data: data,error: function (xhr, ajaxOptions, thrownError) {alert(xhr.responseText);alert(thrownError);},xhr: function () {var xhr = new window.XMLHttpRequest();//Download progressxhr.addEventListener("progress", function (evt) {console.log(evt.lengthComputable);if (evt.lengthComputable) {var percentComplete = evt.loaded / evt.total;$("progress").val(evt.loaded);}}, false);return xhr;},beforeSend: function () {$('#loading').show();},complete: function () {$("#loading").hide();},success: function (json) {$("#data").html("data receieved");}});});});
</script>
</body>
</html>
上传数据预览
2、后台代码
controller类
/// <summary>/// 本地生成新的文件/// </summary>/// <returns></returns>[HttpPost]public IHttpActionResult createNewfile(){HttpFileCollection files = HttpContext.Current.Request.Files;RegionDAL regionDAL = new RegionDAL();Callback callback = new Callback();//try{callback.status = 1;callback.msg = "success";callback.data = regionDAL.createNewfile(files);}catch (Exception e){callback.status = 0;callback.msg = e.Message;}return Ok(callback);}
DAL类(保存了前两列的数据;设置了标题)
public object createNewfile(HttpFileCollection files){string prepath = "C:/Users/xcy/Desktop/";添加评估文件string filename;string savepath;foreach (string key in files.AllKeys){HttpPostedFile file = files[key];//判断文件是否为空if (file.ContentLength > 0){filename = Guid.NewGuid().ToString() + "$" + file.FileName;savepath = prepath + filename;file.SaveAs(savepath);HSSFWorkbook hssfworkbook;using (FileStream filestream = new FileStream(savepath, FileMode.Open, FileAccess.Read)){hssfworkbook = new HSSFWorkbook(filestream);}ISheet sheet = hssfworkbook.GetSheetAt(0);DataTable dt = ExcelHelper.RenderDataTableFromExcel(hssfworkbook, sheet.SheetName, 0);//string[] oldColumn = { "F_CODE","F_NAME","F_REGION1"};string[] newColumn = { "F_CODE", "F_NAME", "F_REGION1" };ExcelHelper.Export(dt, "主题", prepath+"hellow.xls", "sheet1111", oldColumn, newColumn);}else{return "不能上传空文件";}}return 1;}
保存excel预览
四、总结
- C#操作excel方法;
- NPOI读取excel;
- NPOI保存excel;
- NPOI的ExcelHelper类;
ExcelHelper类:
using NPOI.HPSF;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;namespace WWJZ.DAL
{public class ExcelHelper{/// <summary> /// datatable导出到excel文件 /// </summary> /// <param name="dtsource">源datatable</param> /// <param name="strheadertext">表头文本</param> /// <param name="strfilename">保存位置</param> /// <param name="strsheetname">工作表名称</param> /// <author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</author> public static void Export(DataTable dtsource, string strheadertext, string strfilename, string strsheetname, string[] oldcolumnnames, string[] newcolumnnames){if (strsheetname == ""){strsheetname = "sheet";}using (MemoryStream ms = Export(dtsource, strheadertext, strsheetname, oldcolumnnames, newcolumnnames)){using (FileStream fs = new FileStream(strfilename, FileMode.Create, FileAccess.Write)){byte[] data = ms.ToArray();fs.Write(data, 0, data.Length);fs.Flush();}}}/// <summary> /// DataTable导出到Excel的MemoryStream /// </summary> /// <param name="dtSource">源DataTable</param> /// <param name="strHeaderText">表头文本</param> /// <param name="strSheetName">工作表名称</param> /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author> public static MemoryStream Export(DataTable dtSource, string strHeaderText, string strSheetName, string[] oldColumnNames, string[] newColumnNames){if (oldColumnNames.Length != newColumnNames.Length){return new MemoryStream();}HSSFWorkbook workbook = new HSSFWorkbook();//HSSFSheet sheet = workbook.CreateSheet();// workbook.CreateSheet(); ISheet sheet = workbook.CreateSheet(strSheetName);#region 右击文件 属性信息{DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();dsi.Company = "http://....../";workbook.DocumentSummaryInformation = dsi;SummaryInformation si = PropertySetFactory.CreateSummaryInformation();//if (HttpContext.Current.Session["realname"] != null)//{// si.Author = HttpContext.Current.Session["realname"].ToString();//}//else//{// if (HttpContext.Current.Session["username"] != null)// {// si.Author = HttpContext.Current.Session["username"].ToString();// }//} //填加xls文件作者信息 si.Author = "xcy";si.ApplicationName = "NPOI"; //填加xls文件创建程序信息 si.LastAuthor = "OA系统"; //填加xls文件最后保存者信息 si.Comments = "OA系统自动创建文件"; //填加xls文件作者信息 si.Title = strHeaderText; //填加xls文件标题信息 si.Subject = strHeaderText; //填加文件主题信息 si.CreateDateTime = DateTime.Now;workbook.SummaryInformation = si;}#endregionICellStyle dateStyle = workbook.CreateCellStyle();IDataFormat format = workbook.CreateDataFormat();dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");#region 取得列宽int[] arrColWidth = new int[oldColumnNames.Length];for (int i = 0; i < oldColumnNames.Length; i++){arrColWidth[i] = Encoding.GetEncoding(936).GetBytes(newColumnNames[i]).Length;}/* foreach (DataColumn item in dtSource.Columns) { arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length; } * */for (int i = 0; i < dtSource.Rows.Count; i++){for (int j = 0; j < oldColumnNames.Length; j++){int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][oldColumnNames[j]].ToString()).Length;if (intTemp > arrColWidth[j]){arrColWidth[j] = intTemp;}}/* for (int j = 0; j < dtSource.Columns.Count; j++) { int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length; if (intTemp > arrColWidth[j]) { arrColWidth[j] = intTemp; } } * */}#endregionint rowIndex = 0;foreach (DataRow row in dtSource.Rows){#region 新建表,填充表头,填充列头,样式if (rowIndex == 65535 || rowIndex == 0){if (rowIndex != 0){sheet = workbook.CreateSheet(strSheetName + ((int)rowIndex / 65535).ToString());}#region 表头及样式{IRow headerRow = sheet.CreateRow(0);headerRow.HeightInPoints = 25;headerRow.CreateCell(0).SetCellValue(strHeaderText);ICellStyle headStyle = workbook.CreateCellStyle();headStyle.Alignment = HorizontalAlignment.Center;IFont font = workbook.CreateFont();font.FontHeightInPoints = 20;font.Boldweight = 700;headStyle.SetFont(font);headerRow.GetCell(0).CellStyle = headStyle;//sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1)); sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));}#endregion#region 列头及样式{//HSSFRow headerRow = sheet.CreateRow(1); IRow headerRow = sheet.CreateRow(1);ICellStyle headStyle = workbook.CreateCellStyle();headStyle.Alignment = HorizontalAlignment.Center;IFont font = workbook.CreateFont();font.FontHeightInPoints = 10;font.Boldweight = 700;headStyle.SetFont(font);for (int i = 0; i < oldColumnNames.Length; i++){headerRow.CreateCell(i).SetCellValue(newColumnNames[i]);headerRow.GetCell(i).CellStyle = headStyle;//设置列宽 sheet.SetColumnWidth(i, (arrColWidth[i] + 1) * 256);}/* foreach (DataColumn column in dtSource.Columns) { headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); headerRow.GetCell(column.Ordinal).CellStyle = headStyle; //设置列宽 sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); } * */}#endregionrowIndex = 2;}#endregion#region 填充内容IRow dataRow = sheet.CreateRow(rowIndex);//foreach (DataColumn column in dtSource.Columns) for (int i = 0; i < oldColumnNames.Length; i++){ICell newCell = dataRow.CreateCell(i);string drValue = row[oldColumnNames[i]].ToString();switch (dtSource.Columns[oldColumnNames[i]].DataType.ToString()){case "System.String"://字符串类型 newCell.SetCellValue(drValue);break;case "System.DateTime"://日期类型 DateTime dateV;DateTime.TryParse(drValue, out dateV);newCell.SetCellValue(dateV);newCell.CellStyle = dateStyle;//格式化显示 break;case "System.Boolean"://布尔型 bool boolV = false;bool.TryParse(drValue, out boolV);newCell.SetCellValue(boolV);break;case "System.Int16"://整型 case "System.Int32":case "System.Int64":case "System.Byte":int intV = 0;int.TryParse(drValue, out intV);newCell.SetCellValue(intV);break;case "System.Decimal"://浮点型 case "System.Double":double doubV = 0;double.TryParse(drValue, out doubV);newCell.SetCellValue(doubV);break;case "System.DBNull"://空值处理 newCell.SetCellValue("");break;default:newCell.SetCellValue("");break;}}#endregionrowIndex++;}using (MemoryStream ms = new MemoryStream()){workbook.Write(ms);ms.Flush();ms.Position = 0;//sheet.Dispose(); sheet = null;workbook = null;//workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet return ms;}}/// <summary> /// WEB导出DataTable到Excel /// </summary> /// <param name="dtSource">源DataTable</param> /// <param name="strHeaderText">表头文本</param> /// <param name="strFileName">文件名</param> /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author> public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName){ExportByWeb(dtSource, strHeaderText, strFileName, "sheet");}/// <summary> /// WEB导出DataTable到Excel /// </summary> /// <param name="dtSource">源DataTable</param> /// <param name="strHeaderText">表头文本</param> /// <param name="strFileName">输出文件名,包含扩展名</param> /// <param name="oldColumnNames">要导出的DataTable列数组</param> /// <param name="newColumnNames">导出后的对应列名</param> public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName, string[] oldColumnNames, string[] newColumnNames){ExportByWeb(dtSource, strHeaderText, strFileName, "sheet", oldColumnNames, newColumnNames);}/// <summary> /// WEB导出DataTable到Excel /// </summary> /// <param name="dtSource">源DataTable</param> /// <param name="strHeaderText">表头文本</param> /// <param name="strFileName">输出文件名</param> /// <param name="strSheetName">工作表名称</param> public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName, string strSheetName){HttpContext curContext = HttpContext.Current;// 设置编码和附件格式 curContext.Response.ContentType = "application/vnd.ms-excel";curContext.Response.ContentEncoding = Encoding.UTF8;curContext.Response.Charset = "";curContext.Response.AppendHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));//生成列 string columns = "";for (int i = 0; i < dtSource.Columns.Count; i++){if (i > 0){columns += ",";}columns += dtSource.Columns[i].ColumnName;}curContext.Response.BinaryWrite(Export(dtSource, strHeaderText, strSheetName, columns.Split(','), columns.Split(',')).GetBuffer());curContext.Response.End();}/// <summary> /// 导出DataTable到Excel /// </summary> /// <param name="dtSource">要导出的DataTable</param> /// <param name="strHeaderText">标题文字</param> /// <param name="strFileName">文件名,包含扩展名</param> /// <param name="strSheetName">工作表名</param> /// <param name="oldColumnNames">要导出的DataTable列数组</param> /// <param name="newColumnNames">导出后的对应列名</param> public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName, string strSheetName, string[] oldColumnNames, string[] newColumnNames){HttpContext curContext = HttpContext.Current;// 设置编码和附件格式 curContext.Response.ContentType = "application/vnd.ms-excel";curContext.Response.ContentEncoding = Encoding.UTF8;curContext.Response.Charset = "";curContext.Response.AppendHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));curContext.Response.BinaryWrite(Export(dtSource, strHeaderText, strSheetName, oldColumnNames, newColumnNames).GetBuffer());curContext.Response.End();}/// <summary>读取excel /// 默认第一行为表头,导入第一个工作表 /// </summary> /// <param name="strFileName">excel文档路径</param> /// <returns></returns> public static DataTable Import(string strFileName){DataTable dt = new DataTable();HSSFWorkbook hssfworkbook;using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)){hssfworkbook = new HSSFWorkbook(file);}ISheet sheet = hssfworkbook.GetSheetAt(0);System.Collections.IEnumerator rows = sheet.GetRowEnumerator();IRow headerRow = sheet.GetRow(0);int cellCount = headerRow.LastCellNum;for (int j = 0; j < cellCount; j++){ICell cell = headerRow.GetCell(j);dt.Columns.Add(cell.ToString());}for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++){IRow row = sheet.GetRow(i);DataRow dataRow = dt.NewRow();for (int j = row.FirstCellNum; j < cellCount; j++){if (row.GetCell(j) != null)dataRow[j] = row.GetCell(j).ToString();}dt.Rows.Add(dataRow);}return dt;}/// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="strFileName">Excel文件全路径(服务器路径)</param> /// <param name="SheetName">要获取数据的工作表名称</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(string strFileName, string SheetName, int HeaderRowIndex){using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)){IWorkbook workbook = new HSSFWorkbook(file);ISheet sheet = workbook.GetSheet(SheetName);return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex);}}/// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="strFileName">Excel文件全路径(服务器路径)</param> /// <param name="SheetIndex">要获取数据的工作表序号(从0开始)</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(string strFileName, int SheetIndex, int HeaderRowIndex){using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)){IWorkbook workbook = new HSSFWorkbook(file);string SheetName = workbook.GetSheetName(SheetIndex);return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex);}}/// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="ExcelFileStream">Excel文件流</param> /// <param name="SheetName">要获取数据的工作表名称</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex){IWorkbook workbook = new HSSFWorkbook(ExcelFileStream);ExcelFileStream.Close();return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex);}/// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="ExcelFileStream">Excel文件流</param> /// <param name="SheetIndex">要获取数据的工作表序号(从0开始)</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex){IWorkbook workbook = new HSSFWorkbook(ExcelFileStream);ExcelFileStream.Close();string SheetName = workbook.GetSheetName(SheetIndex);return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex);}/// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="workbook">要处理的工作薄</param> /// <param name="SheetName">要获取数据的工作表名称</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(IWorkbook workbook, string SheetName, int HeaderRowIndex){ISheet sheet = workbook.GetSheet(SheetName);DataTable table = new DataTable();try{IRow headerRow = sheet.GetRow(HeaderRowIndex);int cellCount = headerRow.LastCellNum;for (int i = headerRow.FirstCellNum; i < cellCount; i++){DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);table.Columns.Add(column);}int rowCount = sheet.LastRowNum;#region 循环各行各列,写入数据到DataTablefor (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++){IRow row = sheet.GetRow(i);DataRow dataRow = table.NewRow();for (int j = row.FirstCellNum; j < cellCount; j++){ICell cell = row.GetCell(j);if (cell == null){dataRow[j] = null;}else{//dataRow[j] = cell.ToString(); switch (cell.CellType){case CellType.Blank:dataRow[j] = null;break;case CellType.Boolean:dataRow[j] = cell.BooleanCellValue;break;case CellType.Numeric:dataRow[j] = cell.ToString();break;case CellType.String:dataRow[j] = cell.StringCellValue;break;case CellType.Error:dataRow[j] = cell.ErrorCellValue;break;case CellType.Formula:default:dataRow[j] = "=" + cell.CellFormula;break;}}}table.Rows.Add(dataRow);//dataRow[j] = row.GetCell(j).ToString(); }#endregion}catch (System.Exception ex){table.Clear();table.Columns.Clear();table.Columns.Add("出错了");DataRow dr = table.NewRow();dr[0] = ex.Message;table.Rows.Add(dr);return table;}finally{//sheet.Dispose(); workbook = null;sheet = null;}#region 清除最后的空行for (int i = table.Rows.Count - 1; i > 0; i--){bool isnull = true;for (int j = 0; j < table.Columns.Count; j++){if (table.Rows[i][j] != null){if (table.Rows[i][j].ToString() != ""){isnull = false;break;}}}if (isnull){table.Rows[i].Delete();}}#endregionreturn table;}}
}
.NET——NPOI操作excel相关推荐
- NPOI 操作Excel学习总结
NPOI读写Excel http://www.cnblogs.com/luxiaoxun/p/3374992.html 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表 ...
- npoi获取合并单元格_梦琪小生 C# 如何使用NPOI操作Excel以及读取合并单元格等
C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...
- C# 使用NPOI 操作 Excel 文件
C# 使用NPOI 操作 Excel 文件 使用 创建 Excel 文件 创建 XLS 文件 创建 XLSX 文件 合并单元格 设置单元格格式 对齐 字体 边框 填充 保护 数字 下拉框 直接传递下拉 ...
- .NET/C#使用NPOI操作Excel
前言 Asp.net/C#操作Excel最惨的就是环境配置了:使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ...
- hssfwork 导出excel 文件已损坏_C# NPOI 操作EXCEL文件的读取和导出
在实际项目中有很多场景遇到需要操作EXCEL文件,而常用到的库就有NPOI:NPOI是开源的POI 项目的.NET版,POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目, ...
- C#NPOI操作Excel
C#NPOI 一.NPOI的引用 二.操作Excel 1.创建新的Excel工作簿 2.读取现有的Excel工作簿 3.操作sheet工作表 4.操作workbook工作簿 5.跨workbook工作 ...
- NPOI 操作Excel
以下简介--来自百度百科 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Offic ...
- NPOI操作Excel 002:读取Excel
本文讲述如何通过NPOI来读取Excel. 需要准备的dll见: http://blog.csdn.net/yysyangyangyangshan/article/details/42614181 环 ...
- 使用NPOI操作Excel
案例:用NPOI动态生成一个Excel表,然后弹出对话框让用户下载,文件名是"用户列表.xls" 先去相关网站下载 NPOI DLL文件,再引用 application/x-exc ...
最新文章
- opencv 其他形态学变换
- BZOJ-1010 玩具装箱toy (斜率优化)
- c++怎么保留小数位数
- Microsoft Access、MySQL 以及 SQL Server 所使用的数据类型和范围。
- 【跃迁之路】【428天】程序员高效学习方法论探索系列(实验阶段185-2018.04.09)...
- 聊一聊Jmeter与多接口测试
- 线性回归非线性回归_了解线性回归
- 来自Curriki和SankoréWiki的免费教育资源
- linux下配置socks 5代理
- Julia: 关于下载库时WinRPM的Bug
- admin is not in the sudoers file. This incident will be reported
- 使用ASP.NET WEB API构建基于REST风格的服务实战系列教程(一)——使用EF6构建数据库及模型...
- devc语言图形编程教程_devc编程软件程序怎么调试 devc调试步骤图文方法教程
- 北大青鸟(邯郸翱翔)网络校区
- inux命令大全完整版
- java中refresh是什么_JavaWeb Refresh响应头代码实例详解
- 2021秋招----hr面试总结
- 1389: 程序员PIPI II
- 编码消耗率CCR,“上帝代码”,反射,简洁代码
- 技术报告 | 华为云中国信通院:云原生2.0 白皮书.pdf(附下载链接)
热门文章
- python 读取excel太慢_实用技巧——Python实现从Excel读取数据并绘制成图像
- mysql之使用python操作mysql需要commit的情况
- @ModelAttribute注解使用
- 不止是替代 看南天信息与浪潮的金融国产化实践
- 「懒惰的美德」我用 python 写了个自动生成给文档生成索引的脚本
- 【数据结构笔记26】根据一棵树的先序/中序遍历Push与Pop内容,输出这棵树的先序、中序、后序遍历数组(不需要真的建立出树)
- 【数据结构笔记05】堆栈及其顺序存储、链式存储
- mysql任务调度器_mysql存储过程和任务调度器
- 博电继保测试仪说明书_北京博电继电保护测试仪
- 活动选择问题 贪心