using NPOI.SS.UserModel;
using NPOI.XSSF.Streaming;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleReadWriteExcel
{
public class NPOI_ExcelHelper
{
public NPOI_ExcelHelper()
{
}
public NPOI_ExcelHelper(string strFilePath)
{
Open(strFilePath, 0);
CurrentSheet = CurrentExcelWorkbook.GetSheetAt(CurrentExcelWorkbook.ActiveSheetIndex);
}
#region Property
///
/// 当前Excel操作文档
///
public IWorkbook CurrentExcelWorkbook
{
get;
private set;
}
///
/// 当前Excel操作Sheet
///
public ISheet CurrentSheet
{
get;
private set;
}
///
/// 当前操作中的异常Exception
///
public Exception CurrentException { get; set; }
private IFont _CurrentFont = null;
///
/// 当前的字体
///
public IFont CurrentFont
{
get
{
if (_CurrentFont == null && CurrentExcelWorkbook != null)
{
_CurrentFont = CurrentExcelWorkbook.CreateFont();
}
return _CurrentFont;
}
private set
{
_CurrentFont = value;
}
}
private ICellStyle _CurrentCellStyle = null;
///
/// 当前的单元格样式
///
public ICellStyle CurrentCellStyle
{
get
{
if (_CurrentCellStyle == null && CurrentExcelWorkbook != null)
{
_CurrentCellStyle = CurrentExcelWorkbook.CreateCellStyle();
}
return _CurrentCellStyle;
}
set
{
_CurrentCellStyle = value;
}
}
///
/// 得到当前Sheet页的行数
///
public int CurrentSheetRow
{
get
{
return CurrentSheet == null ? 0 : CurrentSheet.PhysicalNumberOfRows;
}
}
private int sheetNum = -1;
///
/// 得到当前Sheet页最大单元格数
///
public int CurrentSheetColumn
{
get
{
if (sheetNum < 0)
{
sheetNum = 0;
if (CurrentSheet != null)
{
for (int i = 0; i < CurrentSheet.PhysicalNumberOfRows; i++)
{
int colNum = GetRowColNum(i);
if (colNum > sheetNum)
{
sheetNum = colNum;
}
}
}
}
return sheetNum;
}
}
public int GetRowColNum(int rowIndex)
{
int colNum = 0;
if (CurrentSheet != null && rowIndex >= 0)
{
IRow pRow = CurrentSheet.GetRow(rowIndex);
if (pRow != null)
{
colNum = pRow.LastCellNum;
}
}
return colNum;
}
#endregion
///
/// 打开Excel中的Sheet页(索引)
///
///
///
///
///
public bool Open(string strFilePath, int SheetIndex, bool IsBigOperation = false)
{
CurrentExcelWorkbook = OpenFile(strFilePath, IsBigOperation);
try
{
CurrentSheet = CurrentExcelWorkbook.GetSheetAt(SheetIndex);
}
catch (Exception ex)
{
CurrentException = ex;
return false;
}
return true;
}
///
/// 打开Excel文件
///
///
///
///
private IWorkbook OpenFile(string strFilePath, bool isBigOperation)
{
try
{
using (FileStream fs = new FileStream(strFilePath, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = null;
if (isBigOperation)
{
XSSFWorkbook pXSSFWorkbook = new XSSFWorkbook(fs);
workbook = new SXSSFWorkbook(pXSSFWorkbook, 1000);
}
else
{
workbook = WorkbookFactory.Create(fs);
}
return workbook;
}
}
catch (Exception ex)
{
CurrentException = ex;
return null;
}
}
///
/// 写Excel
///
///
///
///
public bool WriteExcel(int startRowIndex, List listData)
{
try
{
ISheet sheet = CurrentExcelWorkbook.GetSheetAt(0);
for (int i = 0; i < listData.Count; i++)
{
IRow pRow = sheet.CreateRow(startRowIndex);
for (int j = 0; j < 5; j++)
{
pRow.CreateCell(j).SetCellValue(listData[i].ToString());
}
startRowIndex++;
}
return true;
}
catch (Exception ex)
{
return false;
}
}
///
/// 保存Xlsx格式修改
///
///
///
public bool SaveXlsxChange(string strExcelFilePath)
{
try
{
using (var file = new FileStream(strExcelFilePath, FileMode.Create, FileAccess.Write))
{
CurrentExcelWorkbook.Write(file);
file.Close();
}
return true;
}
catch (Exception ex)
{
return false;
}
}
///
/// 读取Excel文件内容转换为DataSet,列名依次为 "c0"……c[columnlength-1]
///
/// 文件绝对路径
/// 数据开始行数(1为第一行)
/// 每列的数据类型
///
public DataTable ReadExcel(string FileName, int startRow, int StrartCol)
{
int ertime = 0;
int intime = 0;
DataTable dt = new DataTable(Path.GetFileName(FileName));
DataRow dr;
StringBuilder sb = new StringBuilder();
NpoiDataType[] ColumnDataType = null;
string ColName = "ColName";
using (FileStream stream = new FileStream(@FileName, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = WorkbookFactory.Create(stream); //使用接口,自动识别excel2003/2007格式
ISheet sheet = workbook.GetSheetAt(0);//得到里面第一个sheet
int sheetNum = workbook.NumberOfSheets;
int j;
IRow row;
#region ColumnDataType赋值
if (ColumnDataType == null || ColumnDataType.Length <= 0)
{
row = sheet.GetRow(startRow - 1);//得到第i行
ColumnDataType = new NpoiDataType[row.LastCellNum + 30 - StrartCol];
for (int i = StrartCol; i < ColumnDataType.Length; i++)
{
ICell hs = row.GetCell(i);
ColumnDataType[i - StrartCol] = GetCellDataType(hs);
}
}
#endregion
for (j = StrartCol; j < ColumnDataType.Length; j++)
{
row = sheet.GetRow(startRow - 1);//得到第i行
Type tp = GetDataTableType(ColumnDataType[j]);
string strColumnName = string.Format("{0}{1}", ColName, j); ;
dt.Columns.Add(strColumnName, tp);
}
Dictionary dic = new Dictionary();
List startCols = new List();
List endCols = new List();
int RowCout = sheet.PhysicalNumberOfRows > sheet.LastRowNum ? sheet.PhysicalNumberOfRows : sheet.LastRowNum;
for (int k = 0; k <= RowCout; k++)
{
row = sheet.GetRow(k);
if (row == null) continue;
int start = 0, end = 0;
for (int i = 0; i < row.Cells.Count; i++)
{
if (!string.IsNullOrEmpty(row.Cells[i].ToString()))
{
start = i;
break;
}
}
startCols.Add(start);
for (int i = 0; i < row.Cells.Count; i++)
{
if (!string.IsNullOrEmpty(row.Cells[i].ToString()))
{
end = row.Cells[i].ColumnIndex;
}
}
endCols.Add(end);
}
int Start_Col = 9999, End_Col = 0;
for (int i = 0; i < startCols.Count; i++)
{
int s = startCols[i], e = endCols[i];
if (s < Start_Col)
Start_Col = s;
if (e > End_Col)
End_Col = e;
}
for (int i = startRow; i <= RowCout; i++)
{
row = sheet.GetRow(i);//得到第i行
if (row == null) continue;
try
{
dr = dt.NewRow();
for (j = StrartCol; j < ColumnDataType.Length; j++)
{
dr[j - StrartCol] = GetCellData(row, j);
}
dt.Rows.Add(dr);
intime++;
}
catch (Exception ex)
{
ertime++;
sb.Append(string.Format("第{0}行出错:{1}rn", i + 1, ex.Message));
continue;
}
}
for (int i = dt.Columns.Count - 1; i > End_Col - StrartCol; i--)
{
dt.Columns.RemoveAt(i);
}
if (Start_Col > 0)
{
for (int l = Start_Col - 1; l >= 0; l--)
{
dt.Columns.RemoveAt(l);
}
}
}
return dt;
}
///
/// 读Excel-根据NpoiDataType创建的DataTable列的数据类型
///
///
///
private Type GetDataTableType(NpoiDataType datatype)
{
Type tp = typeof(string);//Type.GetType("System.String")
switch (datatype)
{
case NpoiDataType.Bool:
tp = typeof(bool);
break;
case NpoiDataType.Datetime:
tp = typeof(DateTime);
break;
case NpoiDataType.Numeric:
tp = typeof(double);
break;
case NpoiDataType.Error:
tp = typeof(string);
break;
case NpoiDataType.Blank:
tp = typeof(string);
break;
}
return tp;
}
///
/// 获取单元格数据类型
///
///
///
private NpoiDataType GetCellDataType(ICell hs)
{
NpoiDataType dtype = NpoiDataType.String;
return dtype;
}
///
/// 读Excel-得到不同数据类型单元格的数据
///
/// 数据类型
/// 数据中的一行
/// 哪列
///
private object GetCellData(IRow row, int column)
{
ICell cell = row.GetCell(column);
if (cell != null)
{
if (cell == null)
{
return "";
}
CellType datatype = cell.CellType;
switch (datatype)
{
case CellType.String:
try { return cell.StringCellValue; }
catch (Exception ex)
{
return "";
}
case CellType.Boolean:
try { return cell.BooleanCellValue; }
catch (Exception ex)
{
return cell.StringCellValue;
}
case CellType.Numeric:
decimal d;
string strValue = cell.ToString();
if (System.Decimal.TryParse(strValue, out d))
{
return d;
}
else
{
try { return cell.DateCellValue; }
catch (Exception ex)
{
return cell.StringCellValue;
}
}
case CellType.Formula:
try
{
return cell.NumericCellValue;
}
catch (Exception)
{
try
{
return cell.StringCellValue;
}
catch (Exception ex)
{
return "";
}
}
case CellType.Error:
try
{
return cell.ErrorCellValue;
}
catch (Exception ex)
{
return cell.StringCellValue;
}
case CellType.Blank:
try
{
return cell.StringCellValue;
}
catch (Exception ex)
{
return "";
}
default:
return "";
}
}
else
{
return "";
}
}
}
///
/// 枚举(Excel单元格数据类型)
///
public enum NpoiDataType
{
///
/// 字符串类型-值为1
///
String,
///
/// 布尔类型-值为2
///
Bool,
///
/// 时间类型-值为3
///
Datetime,
///
/// 数字类型-值为4
///
Numeric,
///
/// 复杂文本类型-值为5
///
Richtext,
///
/// 空白
///
Blank,
///
/// 错误
///
Error
}
}
using Aspose.Cells;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleReadWriteExcel
{
public class AsposeCell_ExcelHelper
{
public AsposeCell_ExcelHelper() { }
public AsposeCell_ExcelHelper(string excelPath)
{
Open(excelPath, 0);
CurrentSheet = CurrentWorkBook.Worksheets[CurrentWorkBook.Worksheets.ActiveSheetIndex];
}
private Exception _CurrentException = null;
///
/// Excel操作异常
///
public Exception CurrentException
{
get
{
return _CurrentException;
}
set
{
_CurrentException = value;
}
}
///
/// 当前操作的excel
///
public Workbook CurrentWorkBook
{
get;
private set;
}
///
/// 当前操作的Sheet
///
public Worksheet CurrentSheet
{
get;
private set;
}
public int CurrentSheetColumn
{
get
{
int colNum = 0;
if (CurrentSheet != null)
{
colNum = CurrentSheet.Cells.MaxColumn + 1;
}
return colNum;
}
}
public int CurrentSheetRow
{
get
{
int rowNum = 0;
if (CurrentSheet != null)
{
rowNum = CurrentSheet.Cells.Rows.Count;
}
return rowNum;
}
}
///
/// 打开Excel指定Sheet索引
///
///
///
///
///
public bool Open(string strFilePath, int SheetIndex, bool IsBigOperation = false)
{
try
{
CurrentWorkBook = new Workbook(strFilePath);
CurrentSheet = CurrentWorkBook.Worksheets[SheetIndex];
return true;
}
catch (Exception ex)
{
CurrentException = ex;
return false;
}
}
///
/// 保存当前Excel
///
///
public bool Save()
{
try
{
if (CurrentWorkBook != null)
{
if (!string.IsNullOrEmpty(CurrentWorkBook.FileName))
{
string filePath = CurrentWorkBook.FileName;
XlsSaveOptions saveOpt = new XlsSaveOptions();
CurrentWorkBook.CalculateFormula(true);
saveOpt.CreateDirectory = true;
CurrentWorkBook.Save(filePath, saveOpt);
return true;
}
}
return false;
}
catch (Exception ex)
{
CurrentException = ex;
return false;
}
}
///
/// 写Excel
///
///
///
///
public bool WriteExcel(int startRowIndex, List listData)
{
try
{
for (int i = 0; i < listData.Count; i++)
{
for (int j = 0; j < 5; j++)
{
CurrentSheet.Cells[i, j].PutValue(listData[i].ToString());
}
}
return true;
}
catch (Exception ex)
{
CurrentException = ex;
return false;
}
}
///
/// 按行读取指定范围单元格值
///
///
///
///
public void GetData(ReadDataDelegate pReadDataDelegate, int StartRowIndex, int StartColumnIndex)
{
if (CurrentSheet != null)
{
int rowMax = CurrentSheet.Cells.MaxRow + 1;
int colMax = CurrentSheet.Cells.MaxColumn + 1;
for (int i = StartRowIndex; i < CurrentSheet.Cells.Rows.Count; i++)
{
List
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleReadWriteExcel
{
public class EPPlus_ExcelHelper
{
public static void EPPlus_ExcelHelperLicenseContext()
{
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
}
public void SaveExcel(string strExcelPath,List listData)
{
using (var package = new ExcelPackage(new FileInfo(strExcelPath)))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
for (int i = 0; i < listData.Count; i++)
{
for (int j = 0; j < 5; j++)
{
worksheet.Cells[i+1, j+1].Value=listData[i].ToString();
}
}
package.Save();//保存excel
}
}
public void ReadData(ReadDataDelegate pReadDataDelegate, string path, int StartRowIndex, int StartColumnIndex)
{
var fs = new FileStream(path, FileMode.Open, FileAccess.Read);
var excel = new ExcelPackage(fs);
var worksheet = excel.Workbook.Worksheets[0];
var row = worksheet.Dimension.End.Row;
var col = worksheet.Dimension.End.Column;
for (var i = StartRowIndex; i <= row; i++)
{
List readDatas = new List();
for (var j = StartColumnIndex; j <= col; j++)
{
readDatas.Add(worksheet.Cells[i, j].Value);
}
pReadDataDelegate.Invoke(readDatas, false);
}
}
}
}
using MiniExcelLibs;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleReadWriteExcel
{
public class MiniExcel_ExcelHelper
{
public void SaveExcel(string strExcelPath, List listData)
{
var values = new List>();
foreach (var item in listData)
{
Dictionary dic = new Dictionary();
for (int i = 0; i < 5; i++)
{
dic.Add($"Column{i + 1}", item);
}
values.Add(dic);
}
MiniExcel.SaveAs(strExcelPath, values);
}
internal IEnumerable ReadData(string strOutputExcelPath)
{
var rows = MiniExcel.Query(strOutputExcelPath);
int count = rows.Count(a => true);
return rows;
}
}
class UserAccount
{
public string Column1 { get; set; }
public string Column2 { get; set; }
public string Column3 { get; set; }
public string Column4 { get; set; }
public string Column5 { get; set; }
}
}
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleReadWriteExcel
{
public class MiniExcel_ExcelHelper
{
public void SaveExcel(string strExcelPath, List listData)
{
var values = new List>();
foreach (var item in listData)
{
Dictionary dic = new Dictionary();
for (int i = 0; i < 5; i++)
{
dic.Add($"Column{i + 1}", item);
}
values.Add(dic);
}
MiniExcel.SaveAs(strExcelPath, values);
}
internal IEnumerable ReadData(string strOutputExcelPath)
{
var rows = MiniExcel.Query(strOutputExcelPath);
int count = rows.Count(a => true);
return rows;
}
}
class UserAccount
{
public string Column1 { get; set; }
public string Column2 { get; set; }
public string Column3 { get; set; }
public string Column4 { get; set; }
public string Column5 { get; set; }
}
}