using System;
using System.IO;
using System.Windows.Forms;
using System.Data;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.SS.Util;
using NPOI.HSSF.Util;
namespace BaseLibRWFile
{
public class Excel
{
ICell cell = null;
///
/// 把DataGridView控件里面的数据读出,放在DataTable里面
///
/// DataGridView控件
///
public DataTable GetDgvToTable(DataGridView dgv)
{
DataTable dt = new DataTable();
for (int i = 0; i < dgv.Columns.Count; i++)
{
DataColumn dc = new DataColumn(dgv.Columns[i].Name.ToString());
dt.Columns.Add(dc);
}
for (int i = 0; i < dgv.Rows.Count - 1; i++)
{
DataRow dr = dt.NewRow();
for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
{
dr[countsub] = Convert.ToString(dgv.Rows[i].Cells[countsub].Value);
}
dt.Rows.Add(dr);
}
return dt;
}
///
/// 把Excel的数据读出,放在DataTable里面
///
/// Excel文件完整路径
/// sheet名称,可不填,默认第一个sheet
///
public DataTable ExcelToDataTable(string filePath, string sheetname = "")
{
if (!File.Exists(filePath))
{
return null;
}
DataTable dt = new DataTable();
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
IWorkbook wk;
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
if (wk != null)
{
ISheet sheet;
if (string.IsNullOrEmpty(sheetname))
{
sheet = wk.GetSheetAt(0);
}
else
{
sheet = wk.GetSheet(sheetname);
}
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
IRow headerRow = null;
int cellCount = 0;
for (int i = 0; i <= sheet.LastRowNum; i++)
{
headerRow = sheet.GetRow(i);
if (headerRow!=null)
{
if (headerRow.LastCellNum > cellCount)
{
cellCount = headerRow.LastCellNum;
}
}
}
//得到Excel工作表的总列数
for (int j = 0; j < cellCount; j++)
{
ICell cell = headerRow.GetCell(j);
if (cell == null)
{
dt.Columns.Add("");
}
else
{
dt.Columns.Add();
}
}
for (int i = 0; i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
DataRow dataRow = dt.NewRow();
if (row != null)
{
for (int j = row.FirstCellNum; j < cellCount; j++)
{
ICell cell = row.GetCell(j);
if (cell == null)
{
dataRow[j] = "";
}
else
{
switch (cell.CellType)
{
case CellType.Blank:
dataRow[j] = "";
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:
try
{
dataRow[j] = cell.NumericCellValue;
}
catch
{
dataRow[j] = cell.StringCellValue;
}
break;
default:
dataRow[j] = cell.CellFormula;
break;
}
}
}
dt.Rows.Add(dataRow);
}
}
}
}
return dt;
}
///
/// 把Excel的数据读出,放在DataSet里面
///
/// Excel文件完整路径
///
public DataSet ExcelToDataSet(string filePath)
{
DataSet ds = new DataSet();
try
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
IWorkbook wk = null;
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
if (wk != null)
{
ISheet sheet = null;
for (int i = 0; i < wk.NumberOfSheets; i++)
{
string sheetname = wk.GetSheetName(i);
sheet = wk.GetSheet(sheetname);
if (sheet != null)
{
DataTable dt = ExcelToDataTable(filePath, sheetname);
if (dt != null)
{
dt.TableName = sheetname.Trim();
ds.Tables.Add(dt);
}
}
}
}
}
return ds;
}
catch (Exception ex)
{
MessageBox.Show($"读取数据到DataSet出错\r\n{ex.Message}", "Error");
return null;
}
}
///
/// 向Excel文件插入一行以逗号分隔的字符串
///
/// Excel文件完整路径
/// 工作表名称
/// 插入位置(第几行)
/// 插入内容
///
public bool InsertRow(string filePath, int RowNo, string strValue, string sheetname=null)
{
try
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet =sheetname==null?wk.GetSheetAt(0):wk.GetSheet(sheetname);
sheet.ShiftRows(RowNo, sheet.LastRowNum + 1, 1);
string[] s = strValue.Split(',');
IRow row1 = sheet.CreateRow(RowNo);
ICell cell = null;
for (int i = 0; i < s.Length; i++)
{
cell = row1.CreateCell(i);
cell.SetCellValue(s[i]);
}
using (FileStream fileStream = File.Create(filePath))
{
wk.Write(fileStream);
fileStream.Close();
}
return true;
}
catch (Exception ex)
{
MessageBox.Show($"Excel插入行出错\r\nExcel insert row error\r\n{ex.Message}", "Warning");
return false;
}
}
///
/// 向Excel文件写入一行以逗号分隔的字符串
///
/// Excel文件完整路径
/// 工作表名称
/// 写入位置(第几行)
/// 插入内容
///
public bool WriteRow(string filePath, int RowNo, string strValue, string sheetname = null)
{
try
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet = sheetname == null ? wk.GetSheetAt(0) : wk.GetSheet(sheetname);
IRow row1 = sheet.GetRow(RowNo);
if (row1==null)
{
row1 = sheet.CreateRow(RowNo);
}
string[] s = strValue.Split(',');
ICell cell = null;
for (int i = 0; i < s.Length; i++)
{
cell = row1.CreateCell(i);
cell.SetCellValue(s[i]);
}
using (FileStream fileStream = File.Create(filePath))
{
wk.Write(fileStream);
fileStream.Close();
}
return true;
}
catch (Exception ex)
{
MessageBox.Show($"Excel写入行出错\r\nExcel insert row error\r\n{ex.Message}", "Warning");
return false;
}
}
///
/// 向Excel文件写入一列以逗号分隔的字符串
///
/// Excel文件完整路径
/// 工作表名称
/// 写入位置(列)
/// 写入位置(起始行)
/// 写入内容
///
public bool WriteColumn(string filePath, int column,int startRow,string strValue, string sheetname = null)
{
try
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet = sheetname == null ? wk.GetSheetAt(0) : wk.GetSheet(sheetname);
IRow row = null;
ICell cell = null;
string[] str = strValue.Split(',');
for (int i = 0; i < str.Length; i++)
{
row = sheet.GetRow(startRow+i);
if (row == null)
{
row = sheet.CreateRow(startRow+i);
}
cell = row.CreateCell(column);
cell.SetCellValue(str[i]);
}
using (FileStream fileStream = File.Create(filePath))
{
wk.Write(fileStream);
fileStream.Close();
}
return true;
}
catch (Exception ex)
{
MessageBox.Show($"Excel写入列出错\r\nExcel write column error\r\n{ex.Message}", "Warning");
return false;
}
}
///
/// 向Excel文件写入一列double数组
///
/// Excel文件完整路径
/// 工作表名称
/// 写入位置(列)
/// 写入位置(起始行)
/// 写入内容
///
public bool WriteColumn(string filePath, int column, int startRow, double[] dValue, string sheetname = null)
{
try
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet = sheetname == null ? wk.GetSheetAt(0) : wk.GetSheet(sheetname);
IRow row = null;
ICell cell = null;
for (int i = 0; i < dValue.Length; i++)
{
row = sheet.GetRow(startRow + i);
if (row == null)
{
row = sheet.CreateRow(startRow + i);
}
cell = row.CreateCell(column);
cell.SetCellValue(dValue[i]);
}
using (FileStream fileStream = File.Create(filePath))
{
wk.Write(fileStream);
fileStream.Close();
}
return true;
}
catch (Exception ex)
{
MessageBox.Show($"Excel写入列出错\r\nExcel write column error\r\n{ex.Message}", "Warning");
return false;
}
}
///
/// 向Excel文件指定单元格写入数据
///
/// Excel文件完整路径
/// 工作表名称
/// 行号
/// 列号
/// 插入内容
///
public bool SetCellValue(string filePath, string sheetname, int row, int column, string value)
{
try
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet = wk.GetSheet(sheetname);
IRow row1 = sheet.CreateRow(row);
ICell cell = row1.CreateCell(column);
//cell = sheet.GetRow(row).GetCell(column);
//sheet.ForceFormulaRecalculation = true; //强制计算
//sheet.ProtectSheet("123");//密码保护
if (value.Contains(","))
{
string[] s = value.Split(',');
for (int i = 0; i < s.Length; i++)
{
cell = row1.CreateCell(i);
cell.SetCellValue(s[i]);
}
}
else
{
cell.SetCellValue(value);
}
using (FileStream fileStream = File.Create(filePath))
{
wk.Write(fileStream);
fileStream.Close();
}
return true;
}
catch (Exception ex)
{
MessageBox.Show($"Excel向指定单元格写入数据失败\r\nFails to write data to specified cell\r\n{ex.Message}", "Warning");
return false;
}
}
public bool SetExcelCellValue(string filePath, String sheetname, int row, int column, String value)
{
bool returnb;
try
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
//把xls文件读入workbook变量里,之后就可以关闭了
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
//把xls文件读入workbook变量里,之后就可以关闭了
ISheet sheet = wk.GetSheet(sheetname);
GetCellValue(cell);
cell = sheet.GetRow(row).GetCell(column);
cell.SetCellValue(value);
using (FileStream fileStream = File.Create(filePath))
{
wk.Write(fileStream);
fileStream.Close();
}
returnb = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
returnb = false;
// throw;
}
return returnb;
}
//获取cell的数据,并设置为对应的数据类型
public object GetCellValue(ICell cell)
{
object value = null;
try
{
if (cell.CellType != CellType.Blank)
{
switch (cell.CellType)
{
case CellType.Numeric:
// Date comes here
if (DateUtil.IsCellDateFormatted(cell))
{
value = cell.DateCellValue;
}
else
{
// Numeric type
value = cell.NumericCellValue;
}
break;
case CellType.Boolean:
// Boolean type
value = cell.BooleanCellValue;
break;
case CellType.Formula:
value = cell.CellFormula;
break;
default:
// String type
value = cell.StringCellValue;
break;
}
}
}
catch (Exception)
{
value = "";
}
return value;
}
///
/// 设置sheet密码
///
/// Excel文件完整路径
/// 要设置的密码
/// 工作表名称(可为空)
///
public void SetSheetPassword(string filePath, string password, string sheetname=null)
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet = null;
if (string.IsNullOrEmpty(sheetname))
{
sheet = wk.GetSheetAt(0);
}
else
{
sheet = wk.GetSheet(sheetname);
}
//sheet.SetColumnWidth(0, 15 * 256);//设置列宽
sheet.ProtectSheet(password);
using (FileStream fileStream = File.Create(filePath))
{
wk.Write(fileStream);
fileStream.Close();
}
}
///
/// 读Excel文件指定单元格数据
///
/// Excel文件完整路径
/// 工作表名称
/// 行号
/// 列号
///
public string GetCellValue(string filePath, string sheetname, int row, int column)
{
try
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet = wk.GetSheet(sheetname);
ICell cell = sheet.GetRow(row).GetCell(column);
return cell.ToString();
}
catch (Exception ex)
{
MessageBox.Show($"读Excel文件指定单元格数据失败\r\nReading specified cell data failed\r\n{ex.Message}", "Warning");
return null;
}
}
///
/// 创建Excel文件
///
/// Excel文件完整路径
/// 工作表名称
///
public bool CreatExcel(string filePath, string[] SheetName = null)
{
try
{
IWorkbook wk = null;
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook();
}
else
{
wk = new HSSFWorkbook();
}
SheetName = SheetName ?? (new string[] { "sheet1" });
for (int i = 0; i < SheetName.Length; i++)
{
wk.CreateSheet(SheetName[i]);
}
FileStream fs = new FileStream(filePath, FileMode.Create);
wk.Write(fs);
fs.Close();
return true;
}
catch (Exception ex)
{
MessageBox.Show($"创建Excel失败\r\nExcel creation failed\r\n{ex.Message}", "Error");
return false;
}
}
///
/// 把DataTable数据写入Excel文件
///
/// Excel文件完整路径
/// DataTable数据
///
public bool DataTableToExcel(string filePath, DataTable dt)
{
try
{
IWorkbook wk = null;
if (File.Exists(filePath))
{
File.Delete(filePath);
}
if (!File.Exists(filePath)) //判断文件是否存在,不存在时则创建并添加表头
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook();
}
else
{
wk = new HSSFWorkbook();
}
using (FileStream fs1 = new FileStream(filePath, FileMode.OpenOrCreate))//读取流
{
//创建sheet
ISheet sheet = wk.CreateSheet("Sheet1");
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
wk.Write(fs1);
fs1.Close();
}
}
else
{ //如果文件已存在则首先打开,并且获取到最大的行数
using (FileStream fs = new FileStream(filePath, FileMode.Open))//读取流
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
ISheet sheet1 = wk.GetSheetAt(0);
//int num = sheet1.LastRowNum + 1;//获取最大行数
FileStream fout = new FileStream(filePath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);//写入流
for (int i = 0; i < dt.Rows.Count; i++)
{
//创建行数时+num
IRow row = sheet1.CreateRow(i);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
wk.Write(fout);
fs.Close();
fout.Close();
}
}
return true;
}
catch
{
//MessageBox.Show($"创建Excel失败\r\nExcel creation failed\r\n{ex.Message}", "Error");
return false;
}
}
///
/// 读Excel文件指定Sheet数据,返回二维数组字符串
///
/// Excel文件完整路径
/// 工作表名称
/// 行号
/// 列号
///
public string[,] ReadSheetData(string filePath, string SheetName = "", int iRow = -1, int iColumn = -1)
{
try
{
if (!File.Exists(filePath))
{
MessageBox.Show($"{filePath} 文件不存在!\r\nThe specified excel file could not be found or is corrupted!");
return null;
}
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet = string.IsNullOrEmpty(SheetName) ? wk.GetSheetAt(0) : wk.GetSheet(SheetName);
iRow = iRow > 0 ? iRow : sheet.LastRowNum -sheet.FirstRowNum+ 1;
iColumn = iColumn > 0 ? iColumn : sheet.GetRow(sheet.FirstRowNum).LastCellNum + 1;
string[,] ret = new string[iRow, iColumn];
for (int i = sheet.FirstRowNum; i < iRow; i++)
{
for (int j = 0; j < iColumn; j++)
{
try
{
ret[i- sheet.FirstRowNum, j] = sheet.GetRow(i).GetCell(j).ToString();
}
catch
{
ret[i- sheet.FirstRowNum, j] = "";
}
}
}
return ret;
}
catch (Exception ex)
{
MessageBox.Show($"读取Sheet数据失败\r\nFailed to read sheet data\r\n{ex.Message}", "Error");
return null;
}
}
///
/// 合并单元格
///
/// Excel文件完整路径
/// 工作表名称
/// 开始行
/// 结束行
/// 开始列
/// 结束列
/// 合并后写入的数据
/// 字体大小
///
public bool MergeCells(string filePath, int[] startRow, int[] endRow, int[] startColumn, int[] endColumn,
string[] value=null,double[] fontsize=null, string sheetname = null)
{
try
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open,FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet = string.IsNullOrEmpty(sheetname) ? wk.GetSheetAt(0) : wk.GetSheet(sheetname);
for (int i = 0; i < startRow.Length; i++)
{
CellRangeAddress region = new CellRangeAddress(startRow[i], endRow[i], startColumn[i], endColumn[i]);
sheet.AddMergedRegion(region);
ICellStyle style = wk.CreateCellStyle();
style.VerticalAlignment = VerticalAlignment.Center;
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
if (fontsize != null)
{
IFont font = wk.CreateFont();
font.FontHeight = fontsize[i];
style.SetFont(font);
}
//style.FillBackgroundColor = HSSFColor.Red.Index;
IRow row = sheet.GetRow(startRow[i]);
ICell cell = null;
if (row == null)
{
row = sheet.CreateRow(startRow[i]);
}
if (row.GetCell(startColumn[i]) == null)
{
cell = row.CreateCell(startColumn[i]);
}
if (value != null)
{
cell.SetCellValue(value[i]);
}
cell.CellStyle = style;
}
using (FileStream fileStream = File.Create(filePath))
{
wk.Write(fileStream);
fileStream.Close();
}
return true;
}
catch (Exception ex)
{
MessageBox.Show($"合并单元格失败\r\nFailed to merge cells\r\n{ex.Message}", "Error");
return false;
}
}
///
/// 合并单元格
///
/// Excel文件完整路径
/// 工作表名称
/// 开始行
/// 结束行
/// 开始列
/// 结束列
/// 合并后写入的数据
/// 字体大小
///
public bool MergeCells(string filePath, int startRow, int endRow, int startColumn, int endColumn,
string value = null, double fontsize = -1, string sheetname = null)
{
try
{
IWorkbook wk = null;
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
if (filePath.Contains(".xlsx"))
{
wk = new XSSFWorkbook(fs);
}
else
{
wk = new HSSFWorkbook(fs);
}
fs.Close();
}
ISheet sheet = string.IsNullOrEmpty(sheetname) ? wk.GetSheetAt(0) : wk.GetSheet(sheetname);
ICell cell = sheet.CreateRow(startRow).CreateCell(startColumn);
if (value != null)
{
cell.SetCellValue(value);
}
CellRangeAddress region = new CellRangeAddress(startRow, endRow, startColumn, endColumn);
sheet.AddMergedRegion(region);
ICellStyle style = wk.CreateCellStyle();
style.VerticalAlignment = VerticalAlignment.Center;
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
if (fontsize >0)
{
IFont font = wk.CreateFont();
font.FontHeight = fontsize;
style.SetFont(font);
}
//style.FillBackgroundColor = HSSFColor.Red.Index;
cell.CellStyle = style;
using (FileStream fileStream = File.Create(filePath))
{
wk.Write(fileStream);
fileStream.Close();
}
return true;
}
catch (Exception ex)
{
MessageBox.Show($"合并单元格失败\r\nFailed to merge cells\r\n{ex.Message}", "Error");
return false;
}
}
}
}