C#操作NPOI實現(xiàn)Excel數(shù)據(jù)導入導出
首先在項目中引用NPOI,通過管理NuGet程序包,搜索NPOI,選擇版本2.3.0(支持.NET Framework 4.0)根據(jù)自己項目選擇適當版本。
1.NpoiExcelHelper.cs Npoi操作Excel類
using System.Data;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
/// <summary>
/// Npoi操作Excel類
/// </summary>
public static class NpoiExcelHelper
{
/// <summary>
/// 根據(jù)Excel文件類型返回IWorkbook
/// </summary>
/// <param name="fileName">文件路徑/文件名稱(含后綴名)</param>
/// <param name="rowNum">Excel行數(shù)</param>
/// <param name="colNum">Excel列數(shù)</param>
/// <param name="isFirstRowColumn">第一行是否是標題</param>
/// <returns></returns>
public static IWorkbook GetWorkbook(string fileName, out int rowNum, out int colNum, bool isFirstRowColumn = true)
{
bool isXlsx = Path.GetExtension(fileName).Equals(".xlsx");
if (isXlsx)
{
if (isFirstRowColumn)
{
rowNum = 1048575;
}
else
{
rowNum = 1048576;
}
colNum = 16384;
}
else
{
if (isFirstRowColumn)
{
rowNum = 65535;
}
else
{
rowNum = 65536;
}
colNum = 256;
}
if (File.Exists(fileName))
{
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
if (isXlsx)
{
return new XSSFWorkbook(fs);
}
else
{
return new HSSFWorkbook(fs);
}
}
}
else
{
if (isXlsx)
{
return new XSSFWorkbook();
}
else
{
return new HSSFWorkbook();
}
}
}
/// <summary>
/// 將DataTable中的數(shù)據(jù)導入到excel中(第一行是標題)
/// 支持根據(jù)Excel數(shù)據(jù)自動分頁(多個Sheet)
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="fileName">文件路徑/文件名稱(含后綴名)</param>
/// <param name="columnFieldText">字段對應(yīng)中文 順序需要跟Excel中數(shù)據(jù)順序一致</param>
/// <param name="sheetName">Excel中Sheet名稱(多個sheet時 名字后面自動加上數(shù)字序號)</param>
/// <returns></returns>
public static byte[] DataTableToExcel(DataTable dt, string fileName, string[,] columnFieldText = null, string sheetName = null)
{
int rowNum = 0;
int colNum = 0;
IWorkbook workbook = GetWorkbook(fileName, out rowNum, out colNum);
var recordNum = dt.Rows.Count;
int totalPage = recordNum % rowNum == 0 ? recordNum / rowNum : recordNum / rowNum + 1;
for (var p = 0; p < totalPage; p++)
{
if (string.IsNullOrEmpty(sheetName))
{
sheetName = dt.TableName;
}
if (totalPage > 1)
{
if (string.IsNullOrEmpty(sheetName))
{
sheetName = "Sheet";
}
sheetName = sheetName + (p + 1).ToString();
}
else
{
if (string.IsNullOrEmpty(sheetName))
{
sheetName = "Sheet1";
}
}
ISheet sheet = workbook.CreateSheet(sheetName);//創(chuàng)建工作表
#region 標題
IRow row = sheet.CreateRow(0);//在工作表中添加一行
if (columnFieldText != null)
{
var dataColumn = columnFieldText.GetLength(0);
if (dataColumn <= colNum)
{
for (int m = 0; m < dataColumn; m++)
{
ICell cell = row.CreateCell(m);//在行中添加一列
cell.SetCellValue(columnFieldText[m, 1]);//設(shè)置列的內(nèi)容
}
}
else
{
//數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
}
}
else
{
var dataColumn = dt.Columns.Count;
if (dataColumn <= colNum)
{
for (int i = 0; i < dataColumn; i++)
{
ICell cell = row.CreateCell(i);//在行中添加一列
cell.SetCellValue(dt.Columns[i].ColumnName);//設(shè)置列的內(nèi)容
}
}
else
{
//數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
}
}
#endregion
#region 填充數(shù)據(jù)
int startIndex = p * rowNum;
int endindex = (p + 1) * rowNum - 1;
if (endindex >= recordNum)
{
endindex = recordNum - 1;
}
for (int i = startIndex; i <= endindex; i++)//遍歷DataTable行
{
DataRow dataRow = dt.Rows[i];
row = sheet.CreateRow(i - startIndex + 1);//在工作表中添加一行
if (columnFieldText != null)
{
var dataColumn = columnFieldText.GetLength(0);
if (dataColumn <= colNum)
{
for (int m = 0; m < dataColumn; m++)
{
ICell cell = row.CreateCell(m);//在行中添加一列
cell.SetCellValue(dataRow[columnFieldText[m, 0]].ToString());//設(shè)置列的內(nèi)容
}
}
else
{
//數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
}
}
else
{
var dataColumn = dt.Columns.Count;
if (dataColumn <= colNum)
{
for (int j = 0; j < dt.Columns.Count; j++)//遍歷DataTable列
{
ICell cell = row.CreateCell(j);//在行中添加一列
cell.SetCellValue(dataRow[j].ToString());//設(shè)置列的內(nèi)容
}
}
else
{
//數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
}
}
}
#endregion
}
#region 輸出Excel
using (MemoryStream stream = new MemoryStream())
{
workbook.Write(stream);
return stream.ToArray();
}
#endregion
}
/// <summary>
/// 將excel中的數(shù)據(jù)導入到DataTable中(第一行是標題)
/// 支持多個sheet數(shù)據(jù)導入(建議多個sheet的數(shù)據(jù)格式保持一致,將沒有數(shù)據(jù)的sheet刪除)
/// </summary>
/// <param name="fileName">文件路徑(含文件名稱后綴名)</param>
/// <param name="columnFieldText">字段對應(yīng)中文 順序需要跟Excel中數(shù)據(jù)順序一致</param>
/// <param name="sheetName">指定Excel中Sheet名稱 如果為null時,讀取所有sheet中的數(shù)據(jù)</param>
/// <returns>返回的DataTable</returns>
public static DataTable ExcelToDataTable(string fileName, string[,] columnFieldText = null, string sheetName = null)
{
DataTable data = new DataTable();
int rowNum = 0;
int colNum = 0;
IWorkbook workbook = GetWorkbook(fileName, out rowNum, out colNum);
for (int e = 0; e < workbook.NumberOfSheets; e++)
{
ISheet sheet = workbook.GetSheetAt(e);
if (sheet != null)
{
var currentSheetIndex = 0;
if (!string.IsNullOrEmpty(sheetName))
{
if (sheet.SheetName == sheetName)
{
currentSheetIndex = e;
}
}
IRow firstRow = sheet.GetRow(0);
if (firstRow != null)
{
int cellCount = firstRow.LastCellNum; //一行最后一個cell的編號 即總的列數(shù)
var dataColumn = columnFieldText != null ? columnFieldText.GetLength(0) : cellCount;
int startRow = sheet.FirstRowNum;
if (dataColumn <= colNum)
{
if (e == currentSheetIndex)
{
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((columnFieldText != null ? columnFieldText[i, 0] : cellValue));
data.Columns.Add(column);
}
}
}
}
startRow = sheet.FirstRowNum + 1;
//最后一列的標號
int rowCount = sheet.LastRowNum;
for (int i = startRow; i <= rowCount; ++i)
{
IRow row = sheet.GetRow(i);
if (row == null) continue; //沒有數(shù)據(jù)的行默認是null
DataRow dataRow = data.NewRow();
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
if (row.GetCell(j) != null) //同理,沒有數(shù)據(jù)的單元格都默認是null
dataRow[j] = row.GetCell(j).ToString();
}
data.Rows.Add(dataRow);
}
}
else
{
//數(shù)據(jù)列數(shù)超過了Excel的列數(shù)
}
}
if (!string.IsNullOrEmpty(sheetName))
{
if (sheet.SheetName == sheetName)
{
break;
}
}
}
}
return data;
}
}2.WEB項目的調(diào)用方法
(1)數(shù)據(jù)導出到Excel中(支持根據(jù)DataTable數(shù)據(jù)及Excel自動分成多個Sheet)
調(diào)用方法:
int record = 500;
DataTable data = CreateDataTable(record);
string fileName = "客戶明細_" + DateTime.Now.ToString("MMddhhmmss") + ".xls";
string sheetName = "客戶明細";
string[,] columnFieldText = new[,]{
{ "ID", "編號" },
{ "Name", "姓名" },
{ "CreateTime", "創(chuàng)建時間" }
};
//string[,] columnFieldText = null;
var buf = NpoiExcelHelper.DataTableToExcel(data, fileName, columnFieldText, sheetName);
Response.Buffer = true;
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.Charset = "UTF8";
Response.ContentEncoding = Encoding.UTF8;
Response.ContentType = "application/vnd.ms-excel";
string browser = Request.Browser.Browser;
if (browser.Contains("InternetExplorer"))
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
else
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.AddHeader("Content-Length", buf.Length.ToString());
Response.Flush();
Response.BinaryWrite(buf);/// <summary>
/// 創(chuàng)建DataTable對象
/// </summary>
public DataTable CreateDataTable(int record)
{
//創(chuàng)建DataTable
DataTable dt = new DataTable("NewDt");
//創(chuàng)建自增長的ID列
DataColumn dc = dt.Columns.Add("ID", Type.GetType("System.Int32"));
dc.AutoIncrement = true; //自動增加
dc.AutoIncrementSeed = 1; //起始為1
dc.AutoIncrementStep = 1; //步長為1
dc.AllowDBNull = false; //非空
//創(chuàng)建其它列表
dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("CreateTime", Type.GetType("System.DateTime")));
DataRow dr;
for (int i = 0; i < record; i++)
{
dr = dt.NewRow();
dr["Name"] = "名字" + i.ToString();
dr["CreateTime"] = DateTime.Now;
dt.Rows.Add(dr);
}
return dt;
}(2)Excel中數(shù)據(jù)導入DataTable中(支持指定Sheet名稱 / 多個數(shù)據(jù)格式一致的Shee)
string fileName = "客戶明細_0213023109.xls";
string sheetName = "客戶明細1";
string[,] columnFieldText = new[,]{
{ "ID", "編號" },
{ "Name", "姓名" },
{ "CreateTime", "創(chuàng)建時間" }
};
//string[,] columnFieldText = null;
var dt = NpoiExcelHelper.ExcelToDataTable(Server.MapPath(fileName), columnFieldText, sheetName);到此這篇關(guān)于C#操作NPOI實現(xiàn)Excel數(shù)據(jù)導入導出的文章就介紹到這了,更多相關(guān)C# NPOIExcel數(shù)據(jù)導入導出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#設(shè)置自定義文件圖標實現(xiàn)雙擊啟動(修改注冊表)
這篇文章介紹的是利用C#設(shè)置自定義文件圖標,然后實現(xiàn)雙擊啟動的功能,文章給出了示例代碼,介紹的很詳細,有需要的可以參考借鑒。2016-08-08

