一、引言

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相关推荐

  1. NPOI 操作Excel学习总结

    NPOI读写Excel http://www.cnblogs.com/luxiaoxun/p/3374992.html 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表 ...

  2. npoi获取合并单元格_梦琪小生 C# 如何使用NPOI操作Excel以及读取合并单元格等

    C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...

  3. C# 使用NPOI 操作 Excel 文件

    C# 使用NPOI 操作 Excel 文件 使用 创建 Excel 文件 创建 XLS 文件 创建 XLSX 文件 合并单元格 设置单元格格式 对齐 字体 边框 填充 保护 数字 下拉框 直接传递下拉 ...

  4. .NET/C#使用NPOI操作Excel

    前言 Asp.net/C#操作Excel最惨的就是环境配置了:使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ...

  5. hssfwork 导出excel 文件已损坏_C# NPOI 操作EXCEL文件的读取和导出

    在实际项目中有很多场景遇到需要操作EXCEL文件,而常用到的库就有NPOI:NPOI是开源的POI 项目的.NET版,POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目, ...

  6. C#NPOI操作Excel

    C#NPOI 一.NPOI的引用 二.操作Excel 1.创建新的Excel工作簿 2.读取现有的Excel工作簿 3.操作sheet工作表 4.操作workbook工作簿 5.跨workbook工作 ...

  7. NPOI 操作Excel

    以下简介--来自百度百科 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Offic ...

  8. NPOI操作Excel 002:读取Excel

    本文讲述如何通过NPOI来读取Excel. 需要准备的dll见: http://blog.csdn.net/yysyangyangyangshan/article/details/42614181 环 ...

  9. 使用NPOI操作Excel

    案例:用NPOI动态生成一个Excel表,然后弹出对话框让用户下载,文件名是"用户列表.xls" 先去相关网站下载 NPOI DLL文件,再引用 application/x-exc ...

最新文章

  1. opencv 其他形态学变换
  2. BZOJ-1010 玩具装箱toy (斜率优化)
  3. c++怎么保留小数位数
  4. Microsoft Access、MySQL 以及 SQL Server 所使用的数据类型和范围。
  5. 【跃迁之路】【428天】程序员高效学习方法论探索系列(实验阶段185-2018.04.09)...
  6. 聊一聊Jmeter与多接口测试
  7. 线性回归非线性回归_了解线性回归
  8. 来自Curriki和SankoréWiki的免费教育资源
  9. linux下配置socks 5代理
  10. Julia: 关于下载库时WinRPM的Bug
  11. admin is not in the sudoers file. This incident will be reported
  12. 使用ASP.NET WEB API构建基于REST风格的服务实战系列教程(一)——使用EF6构建数据库及模型...
  13. devc语言图形编程教程_devc编程软件程序怎么调试 devc调试步骤图文方法教程
  14. 北大青鸟(邯郸翱翔)网络校区
  15. inux命令大全完整版
  16. java中refresh是什么_JavaWeb Refresh响应头代码实例详解
  17. 2021秋招----hr面试总结
  18. 1389: 程序员PIPI II
  19. 编码消耗率CCR,“上帝代码”,反射,简洁代码
  20. 技术报告 | 华为云中国信通院:云原生2.0 白皮书.pdf(附下载链接)

热门文章

  1. python 读取excel太慢_实用技巧——Python实现从Excel读取数据并绘制成图像
  2. mysql之使用python操作mysql需要commit的情况
  3. @ModelAttribute注解使用
  4. 不止是替代 看南天信息与浪潮的金融国产化实践
  5. 「懒惰的美德」我用 python 写了个自动生成给文档生成索引的脚本
  6. 【数据结构笔记26】根据一棵树的先序/中序遍历Push与Pop内容,输出这棵树的先序、中序、后序遍历数组(不需要真的建立出树)
  7. 【数据结构笔记05】堆栈及其顺序存储、链式存储
  8. mysql任务调度器_mysql存储过程和任务调度器
  9. 博电继保测试仪说明书_北京博电继电保护测试仪
  10. 活动选择问题 贪心