从 excel 创建数据表并写回 excel
Create Datatable from excel and write back to excel
我创建了一个 C# 程序,该程序使用 fileSystemWatcher.Renamed 监视文件夹,其中字符串包含 "xlsx" 以防止重复通知,然后从 E6:AA:10000 中的指定范围读取 excel 并使用 System.Data.OleDb.
创建数据表
这非常有效,可以通过 API 更新和/或创建记录。我的问题是我不相信您可以写回 excel 文件以将行标记为已处理,因此当文件更新时它将再次处理所有行。
因为它可能正在处理多个文件,所以创建索引文件有点复杂,如果在 excel 文件之一中删除行,它可能会破坏索引。我也不想在每次更新时为每条记录查询 API 以查看它是否存在,并且宁愿只处理新行。
对于导入 excel.xlsx 数据的程序,您使用什么技术来了解哪些行是新的并且以前没有被处理过?
我已经能够使用 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;
}
}
}
我创建了一个 C# 程序,该程序使用 fileSystemWatcher.Renamed 监视文件夹,其中字符串包含 "xlsx" 以防止重复通知,然后从 E6:AA:10000 中的指定范围读取 excel 并使用 System.Data.OleDb.
创建数据表这非常有效,可以通过 API 更新和/或创建记录。我的问题是我不相信您可以写回 excel 文件以将行标记为已处理,因此当文件更新时它将再次处理所有行。
因为它可能正在处理多个文件,所以创建索引文件有点复杂,如果在 excel 文件之一中删除行,它可能会破坏索引。我也不想在每次更新时为每条记录查询 API 以查看它是否存在,并且宁愿只处理新行。
对于导入 excel.xlsx 数据的程序,您使用什么技术来了解哪些行是新的并且以前没有被处理过?
我已经能够使用 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;
}
}
}