Создать Datatable из Excel и написать обратно в Excel - PullRequest
0 голосов
/ 29 октября 2018

Я создал программу на C #, которая отслеживает папку с помощью fileSystemWatcher.Renamed, где строка содержит «xlsx», что предотвращает дублирование уведомлений, а затем читает из указанного диапазона E6: AA: 10000 в Excel и создает Datatable с использованием System.Data. OleDb.

Это прекрасно работает, обновляет и / или создает записи через API. Моя проблема в том, что я не верю, что вы можете записать обратно в файл Excel, чтобы пометить строку как обработанную, поэтому при обновлении файла она снова обработает все строки.

Поскольку это может обрабатывать несколько файлов, создание файла индекса несколько затруднено, и если строки будут удалены в одном из файлов Excel, это может нарушить индекс. Я также предпочел бы не запрашивать API для каждой записи каждый раз, когда она обновляется, чтобы определить, существует ли она и предпочитает ли обрабатывать только новые строки.

Какие методы вы используете для программ, которые импортируют данные в excel.xlsx, чтобы узнать, какие строки являются новыми и не были ранее обработаны?

1 Ответ

0 голосов
/ 30 октября 2018

Мне удалось решить эту проблему с помощью 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;

        }

    }
}
...