c# - 从excel创建Datatable并写回excel
问题描述
我创建了一个 C# 程序,该程序使用 fileSystemWatcher.Renamed 监视文件夹,其中字符串包含“xlsx”,可防止重复通知,然后从 excel 中的指定范围 E6:AA:10000 读取并使用 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;
}
}
}
推荐阅读
- javascript - Cheerio 选择的现有属性有时会返回未定义(使用 Puppeteer 获取 HTML)
- ruby-on-rails-6 - Rails 6 GlideJS 轮播问题(没有 jquery)
- python - 如何查看已删除列的列表?
- java - InputMismatchException 需要更多输入吗?
- c# - 2D AABB 碰撞解决多角案例问题 C#
- bash - 通过API获取zabbix graph to png
- flutter - 在颤振中使用 showDialog 会引发错误 - “'!_debugLocked': is not true.”
- ms-access - 我无法编译数据库
- c# - 0MQ / NetMQ - pub-sub - 订阅者如何知道发布者已关闭?
- c# - 等待几秒钟停止症状(团结)