首页 > 解决方案 > 从excel创建Datatable并写回excel

问题描述

我创建了一个 C# 程序,该程序使用 fileSystemWatcher.Renamed 监视文件夹,其中字符串包含“xlsx”,可防止重复通知,然后从 excel 中的指定范围 E6:AA:10000 读取并使用 System.Data.OleDb 创建数据表。

这完美地工作并通过 API 更新和/或创建记录。我的问题是我不相信您可以写回 excel 文件以将行标记为已处理,因此当文件更新时,它将再次处理所有行。

由于它可能正在处理多个文件,因此创建索引文件有点复杂,如果在其中一个 excel 文件中删除行,它可能会破坏索引。我也不想在每次更新时查询每条记录的 API 以查看它是否存在,并且宁愿只处理新行。

对于导入 excel.xlsx 数据的程序,您使用什么技术来了解哪些行是新的并且以前没有处理过?

标签: c#exceldatatablebooleanxlsx

解决方案


我已经能够使用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;

        }

    }
}

推荐阅读