我是为了解决npoi下无法识别空列导致列数不够的问题总是提示超出index值的提示并且定位不准确,可以使用 aspose.cell
Aspose.Cells 是一款功能强大的 Excel 电子表格处理程序库,处理的 Excel 格式包括XLS、XLSX、XLSM、XLSB、XLTX、XLTM、CSV、SpreadsheetML、ODS等,可以将 Excel 文件导出为 PDF, XPS, HTML, MHTML, Plain Text and popular image formats including TIFF, JPG, PNG, BMP and SVG 等。
在我们日常的系统开发中,Aspose.Cells 可以应用于 Excel 数据的导入/导出,Web 网站系统中的 Excel 文件数据的上传下载。因其具有强大的灵活性,且不依赖 Microsoft Excel 环境,备受广大开发人员的喜爱。
在使用 Aspose.Cells 之前,需要安装 Aspose.Cells 的 NuGet 包:
demo操作
导入 Excel 文件为 DataTable
/// <summary>
/// 传入路径,返回 DataTable
/// </summary>
/// <param name="path">Excel 路径,例如:@"E:\C#导入Excel测试数据.xlsx"</param>
/// <returns>一个 DataTable 的数据</returns>
public static DataTable ExcelToDataTable(string path)
{
DataTable dataTable = new DataTable();
Workbook book = new Workbook(path);
// Excel 中 sheets 数量必须大于 0
if (book.Worksheets.Count > 0)
{
// 导入 Excel 文件中的第一个 sheets 工作表
Cells cells = book.Worksheets[0].Cells;
// sheets 中的数据必须存在
if (cells.MaxDataRow != -1 && cells.MaxDataColumn != -1)
{
// 方法 ExportDataTable 的参数说明
// 要导出的第一个单元格的行号。
// 要导出的第一个单元格的列号。
// 要导入的行数。
// 要导入的列数。
// 指示第一行的数据是否导出到DataTable的列名。
dataTable = cells.ExportDataTable(0, 0, cells.MaxDataRow + 1, cells.MaxDataColumn + 1, true);
}
}
return dataTable;
}
导入 Excel 文件为 DataSet
/// <summary>
/// 传入路径,返回 DataSet
/// </summary>
/// <param name="path">Excel 路径,例如:@"E:\C#导入Excel测试数据.xlsx"</param>
/// <returns>一个DataSet的数据</returns>
public static DataSet ExcelToDataSet(string path)
{
DataSet dataSet = new DataSet();
Workbook book = new Workbook(path);
// Excel 中 sheets 数量必须大于 0
if (book.Worksheets.Count > 0)
{
// 遍历 Worksheets
foreach (var sheets in book.Worksheets)
{
// sheets 中的数据必须存在
if (sheets.Cells.MaxDataRow != -1 && sheets.Cells.MaxDataColumn != -1)
{
// 方法 ExportDataTable 的参数说明
// 要导出的第一个单元格的行号。
// 要导出的第一个单元格的列号。
// 要导入的行数。
// 要导入的列数。
// 指示第一行的数据是否导出到DataTable的列名。
DataTable dataTable = sheets.Cells.ExportDataTable(0, 0, sheets.Cells.MaxDataRow + 1, sheets.Cells.MaxDataColumn + 1, true);
dataSet.Tables.Add(dataTable);
}
}
}
return dataSet;
}
导出 DataSet 到 Excel 文件
/// <summary>
/// DataSet 数据导出 Excel
/// </summary>
/// <param name="dataset">DataSet 数据</param>
/// <param name="filepath">文件保存路径名称</param>
public static void DataSetExport(DataSet dataset, string filepath)
{
// 创建工作簿
Workbook book = new Workbook();
for (int i = 0; i < dataset.Tables.Count; i++)
{
if (i!=0)
{
book.Worksheets.Add($"Sheet{i + 1}");
}
// 创建工作表
Worksheet sheet = book.Worksheets[i];
// 单元格
Cells cells = sheet.Cells;
// 生成行 列名行
for (int j = 0; j < dataset.Tables[i].Columns.Count; j++)
{
cells[0, j].PutValue(dataset.Tables[i].Columns[j].ColumnName);
}
// 生成数据行
for (int l = 0; l < dataset.Tables[i].Rows.Count; l++)
{
for (int k = 0; k < dataset.Tables[i].Columns.Count; k++)
{
cells[1 + l, k].PutValue(dataset.Tables[i].Rows[l][k].ToString()); //添加数据
}
}
// 自适应宽
sheet.AutoFitColumns();
}
// 保存
book.Save(filepath);
GC.Collect();
}
提示: 在将数据导出成 Excel 的时候可能会同时导出 Aspose 打上水印的 Sheet (如下图所示),可以参考以下网站进行去除这一页的水印:
https://blog.aspose.com/2021/01/02/evaluation-limitations-aspose-apis/
https://blog.aspose.com/2020/07/20/how-to-buy-aspose-license-a-step-by-step-guide/
本文转载:https://blog.csdn.net/weixin_45581482/article/details/118873685
以下方法仅做参考不一定适用:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using Aspose.Cells;
using System.IO;
using System.Configuration;
class ProcessExcel
{
//初始化excel
public Workbook ImportExcel(string inputFile)
{
try
{
Workbook workBook = new Workbook();
FileStream fs = new FileStream(ConfigurationSettings.AppSettings["InputFile"], FileMode.Open);
int firstIndex=inputFile.LastIndexOf(".");
string fileType = inputFile.Substring(firstIndex);
if (fileType == ".xls")
{
workBook.Open(fs);
return workBook;
}
else
{
workBook.Open(fs, FileFormatType.Excel2007Xlsx);
return workBook;
}
}
catch (Exception ex)
{
Console.WriteLine("EXCEL初始化失败,请检查配置文件!");
Console.ReadKey();
return null;
}
}
//处理sheet
public void processSheet(Worksheet workSheet)
{
Cells cell = workSheet.Cells;
int rowNum = cell.MaxDataRow;
for (int i = 2; i <= rowNum; i++)
{
this.processRow(i, cell);
}
}
//处理行
public void processRow(int rowNum, Cells cell)
{
string userNO = cell[rowNum, 2].StringValue;
string userContent = cell[rowNum, 3].StringValue;
string expectReturnSMS = cell[rowNum, 4].StringValue;
//用例标记为有效
if (cell[rowNum, 1].StringValue == "1")
{
GetResult getResult = new GetResult();
if (getResult.InvokeCMCC(userNO, userContent))
{
if (getResult.GetReturnSMS(userNO))
{
getResult.GetTestResult(expectReturnSMS);
cell[rowNum, 5].PutValue(getResult.returnSMS);
if (getResult.testResult == "FALSE")
{
cell[rowNum, 6].PutValue(getResult.testResult);
cell[rowNum, 6].Style.BackgroundColor = Color.Red;
}
else
{
cell[rowNum, 6].PutValue(getResult.testResult);
cell[rowNum, 6].Style.BackgroundColor = Color.Green;
}
}
else
{
cell[rowNum, 6].PutValue("未获取到返回短信");
cell[rowNum, 6].Style.BackgroundColor = Color.Yellow;
}
}
else
{
cell[rowNum, 6].PutValue("CMCC接口调用异常");
cell[rowNum, 6].Style.BackgroundColor = Color.Yellow;
}
}
//用例无效
else if(cell[rowNum, 1].StringValue == "0")
{
GetResult getResult = new GetResult();
if (getResult.InvokeCMCC(userNO, userContent))
{
Console.WriteLine("此条用例无需执行");
Console.WriteLine();
}
else
{
cell[rowNum, 6].PutValue("CMCC接口调用异常");
Console.WriteLine();
}
}
}
}