Files
Web_BLVLOG_Server_Mvc_Prod/Commonlib/ExcelHelper.cs

236 lines
8.4 KiB
C#
Raw Normal View History

2025-11-20 16:20:04 +08:00
using System.Data;
using NPOI.HSSF.UserModel;
using NPOI.POIFS.FileSystem;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
namespace Commonlib
{
public class ExcelHelper
{
public static DataTable ReadExcelToDataTable(string filePath)
{
DataTable dataTable = new DataTable();
// 打开 Excel 文件
IWorkbook workbook;
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
if (filePath.EndsWith(".xlsx"))
workbook = new XSSFWorkbook(fileStream); // 读取 .xlsx 文件
else if (filePath.EndsWith(".xls"))
workbook = new HSSFWorkbook(fileStream); // 读取 .xls 文件
else
throw new Exception("文件格式不支持,只支持 .xls 和 .xlsx");
}
// 读取第一个工作表
var sheet = workbook.GetSheetAt(0);
if (sheet == null)
throw new Exception("工作表为空!");
// 获取表头
var headerRow = sheet.GetRow(0);
if (headerRow == null)
throw new Exception("未找到表头行!");
for (int i = 0; i < headerRow.LastCellNum; i++)
{
var columnName = headerRow.GetCell(i)?.ToString() ?? $"Column{i}";
dataTable.Columns.Add(columnName);
}
// 读取数据行
for (int i = 1; i <= sheet.LastRowNum; i++) // 从第 1 行(索引为 1开始读取
{
var row = sheet.GetRow(i);
if (row == null) continue;
var dataRow = dataTable.NewRow();
for (int j = 0; j < row.LastCellNum; j++)
{
var cell = row.GetCell(j);
dataRow[j] = cell != null ? GetCellValue(cell) : DBNull.Value;
}
dataTable.Rows.Add(dataRow);
}
return dataTable;
}
static object GetCellValue(ICell cell)
{
switch (cell.CellType)
{
case CellType.Numeric:
return DateUtil.IsCellDateFormatted(cell) ? cell.DateCellValue : cell.NumericCellValue;
case CellType.String:
return cell.StringCellValue;
case CellType.Boolean:
return cell.BooleanCellValue;
case CellType.Formula:
return cell.CellFormula;
case CellType.Blank:
return string.Empty;
default:
return cell.ToString();
}
}
public static void CreateNewExcel(string filePath, DataTable dataTable)
{
IWorkbook workbook;
if (filePath.EndsWith(".xlsx"))
workbook = new XSSFWorkbook(); // 创建 .xlsx 文件
else
workbook = new HSSFWorkbook(); // 创建 .xls 文件
var sheet = workbook.CreateSheet("销售订单");
// 写入表头
var headerRow = sheet.CreateRow(0);
for (int i = 0; i < dataTable.Columns.Count; i++)
{
headerRow.CreateCell(i).SetCellValue(dataTable.Columns[i].ColumnName);
}
// 写入数据
for (int i = 0; i < dataTable.Rows.Count; i++)
{
var dataRow = sheet.CreateRow(i + 1);
for (int j = 0; j < dataTable.Columns.Count; j++)
{
dataRow.CreateCell(j).SetCellValue(dataTable.Rows[i][j].ToString());
}
}
// 设置列宽和行高
SetColumnWidthAndRowHeight(workbook, 0, 0, 1);
SetColumnWidthAndRowHeight(workbook, 0, 1, 1);
SetColumnWidthAndRowHeight(workbook, 0, 2, 1);
SetColumnWidthAndRowHeight(workbook, 0, 3, 1);
SetColumnWidthAndRowHeight(workbook, 0, 4, 1);
// 保存文件
using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
workbook.Write(stream);
}
}
public static void AppendExcel(string filepath)
{
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);//读取流
POIFSFileSystem ps = new POIFSFileSystem(fs);//需using NPOI.POIFS.FileSystem;
IWorkbook workbook = new HSSFWorkbook(ps);
ISheet sheet = workbook.GetSheetAt(0);//获取工作表
IRow row = sheet.GetRow(0); //得到表头
FileStream fout = new FileStream(filepath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);//写入流
row = sheet.CreateRow((sheet.LastRowNum + 1));//在工作表中添加一行
ICell cell1 = row.CreateCell(0);
cell1.SetCellValue("测试数据");//赋值
fout.Flush();
workbook.Write(fout);//写入文件
workbook = null;
fout.Close();
}
public static void EncryptExcel(string path, string password)
{
// 创建HSSF格式工作簿仅支持.xls
var workbook = new HSSFWorkbook();
var sheet = workbook.CreateSheet("Data");
// 设置工作簿保护密码
workbook.WriteProtectWorkbook(password, "owner");
// 保存加密文件
using (var fs = new FileStream(path, FileMode.Create))
{
workbook.Write(fs);
}
}
public static void SetColumnWidthAndRowHeight(IWorkbook workbook, int sheetIndex, int columnIndex, int rowIndex)
{
var sheet = workbook.GetSheetAt(sheetIndex);
// 设置列宽(单位是 1/256 字符宽度)
sheet.SetColumnWidth(columnIndex, 30 * 256); // 设置第 1 列宽度为 20
// 设置行高(单位是点数)
var row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
row.HeightInPoints = 25; // 设置行高为 25 点
}
public void SetCellStyle(IWorkbook workbook, int sheetIndex, int rowIndex, int colIndex)
{
var sheet = workbook.GetSheetAt(sheetIndex);
var cell = sheet.GetRow(rowIndex).GetCell(colIndex) ?? sheet.GetRow(rowIndex).CreateCell(colIndex);
var style = workbook.CreateCellStyle();
// 设置字体
var font = workbook.CreateFont();
font.FontHeightInPoints = 12;
font.FontName = "Arial";
font.IsBold = true;
style.SetFont(font);
// 设置边框
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
// 设置背景颜色
style.FillForegroundColor = IndexedColors.LightBlue.Index;
style.FillPattern = FillPattern.SolidForeground;
cell.CellStyle = style;
cell.SetCellValue("示例文本");
}
public void FullExample(string filePath, DataTable dataTable)
{
IWorkbook workbook = filePath.EndsWith(".xlsx") ? (IWorkbook)new XSSFWorkbook() : new HSSFWorkbook();
var sheet = workbook.CreateSheet("Sheet1");
// 设置表头
var headerRow = sheet.CreateRow(0);
for (int i = 0; i < dataTable.Columns.Count; i++)
{
headerRow.CreateCell(i).SetCellValue(dataTable.Columns[i].ColumnName);
}
// 写入数据
for (int i = 0; i < dataTable.Rows.Count; i++)
{
var dataRow = sheet.CreateRow(i + 1);
for (int j = 0; j < dataTable.Columns.Count; j++)
{
dataRow.CreateCell(j).SetCellValue(dataTable.Rows[i][j].ToString());
}
}
// 设置列宽和行高
SetColumnWidthAndRowHeight(workbook, 0, 1, 1);
// 设置单元格样式
SetCellStyle(workbook, 0, 1, 1);
// 保存文件
using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
workbook.Write(stream);
}
}
}
}