我创建了一个C#程序,该文件使用fileSystemWatcher.Monitor监视文件夹。重命名后,字符串包含“ xlsx”,防止重复通知,然后从Excel中的指定范围E6:AA:10000进行读取,并使用System.Data创建一个Datatable。 OleDb。
这非常有效,可以通过API更新和/或创建记录。我的问题是我不相信您可以写回excel文件来将某行标记为已处理,因此在文件更新时它将再次处理所有行。
由于它可能正在处理多个文件,因此创建一个索引文件有点麻烦,如果在其中一个excel文件中删除了行,则可能会破坏索引。我也不想每次更新记录时都查询每个API的API,以查看它是否存在,并且宁愿只处理新行。
对于导入excel.xlsx数据的程序,您使用什么技术来了解哪些行是新行且之前未进行过处理?
答案 0 :(得分:1)
我已经能够使用EPPLUS解决此问题,在这里我可以将所有单元格读入数据表,然后写回特定行并保存excel文件,如下所示。
using System;
using OfficeOpenXml;
using System.Data;
using System.Linq;
namespace excelReadWrite
{
class Program
{
static void Main(string[] args)
{
// Create Excel Package and set path
ExcelPackage package = new ExcelPackage(new System.IO.FileInfo(@"D:\IDG\test2.xlsx"));
DataTable dt = new DataTable();
dt = ToDataTable(package);
}
public static DataTable ToDataTable(ExcelPackage package)
{
// Sets worksheet to first sheet found
ExcelWorksheet workSheet = package.Workbook.Worksheets.First();
DataTable table = new DataTable();
// Iterate through first row and set Datatable columns
foreach (var firstRowCell in workSheet.Cells[1, 1, 1, workSheet.Dimension.End.Column])
{
table.Columns.Add(firstRowCell.Text);
}
// Iterate through all rows and set values
for (var rowNumber = 2; rowNumber <= workSheet.Dimension.End.Row; rowNumber++)
{
var row = workSheet.Cells[rowNumber, 1, rowNumber, workSheet.Dimension.End.Column];
var newRow = table.NewRow();
foreach (var cell in row)
{
newRow[cell.Start.Column - 1] = cell.Value;
}
// Set value of every row processed last column to 1
workSheet.Cells[rowNumber, workSheet.Dimension.End.Column].Value = 1;
table.Rows.Add(newRow);
}
// Save excel file
package.Save();
return table;
}
}
}