【发布时间】:2020-05-10 20:08:02
【问题描述】:
目标是从代码将创建的新工作簿中收集来自多个工作簿的数据并将其放入一个新工作表中。在合并数据表(工作表)时,我想跳过每个数据表的前 4 行(这是标题),在合并发生之前。以下代码将我的 foreach 循环中的数据表(工作表)数乘以我想从每个数据表中跳过的指定行数(本项目中为 4 行),然后从 MERGED DATATABLE 顶部跳过结果。我最终在第一个输入数据表中丢失了太多行,而其他输入数据表的标题仍在合并数据表中。我曾考虑过使用 DataSets 并对其进行迭代,但是 wb.Worksheets.Add(dt, "Sheet1");只接受 Datatables 作为参数。我无法将 Datasets 或 DataTableCollection 转换为 DataTables 以使事情变得更糟。
using System;
using System.Data;
using System.Data.OleDb;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ClosedXML.Excel;
namespace CompilApp
{
class Program
{
static void Main(string[] args)
{
string dirALC_EDC = @"C:\_________________\";
var files = Directory.GetFiles(dirALC_EDC, "*.*", SearchOption.AllDirectories);
using (DataTable dt = new DataTable())
using (XLWorkbook wb = new XLWorkbook())
{
foreach (string file in files)
{
String theConnString = (String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0\"", file));
OleDbConnection excelConnection = new OleDbConnection(theConnString);
excelConnection.Open();
var da = new OleDbDataAdapter();
var _command_A = new OleDbCommand();
string query_A = @"select *
FROM [Sheet1$]";
_command_A.Connection = excelConnection;
_command_A.CommandText = query_A;
da.SelectCommand = _command_A;
da.Fill(dt);
IEnumerable<DataRow> newRows = dt.AsEnumerable().Skip(4);
DataTable dt2 = newRows.CopyToDataTable();
dt.Clear();
dt.Merge(dt2);
}
wb.Worksheets.Add(dt, "Sheet1");
wb.SaveAs(@"C:___________________.xlsx");
}
}
}
}
【问题讨论】:
标签: c# .net excel oledb oledbdataadapter