NET-如何将多个CSV文件合并为一个具有多个选项卡的MS Excel文件



我有一个.NET应用程序,它可以制作多个类似的CSV文件

1.csv
2.csv
3.csv
.
.
.

我正试图将它们变成一个单独的.xlsx文件,每个CSV的数据都放在一个独立的选项卡中。我遇到过一些NuGet包可以让我做到这一点,但它们似乎都有相当昂贵的许可证。然后我找到了Microsoft.Office.Interop.Excel,我一辈子都搞不清楚。有没有一种简单的方法可以将多个CSV文件组合成一个带有多个选项卡的MS Excel文件?

如果你没有找到任何免费的软件包,我发现EPPlus使用起来很简单。如果你想尝试的话,他们有非商业许可证。对于商业应用程序,它是有价格的。

要制作选项卡,执行ExcelPackage.Workbook.Worksheets.Add("Tab Name");可以创建一个选项卡,然后执行tab.Cells[row, colum].Value = "X"可以输入所需信息。

您不需要任何库来实现这一点。CSV文件只是具有特定格式的文本文件。您所需要做的就是创建一个文件并将其他文件复制到其中:

很抱歉看错了这个问题。以下是NPOI库用法示例:

var files = Directory.GetFiles(DownloadPath);
var combinedFile = Path.Combine(DownloadPath, "Combined.xlsx");
using var target = new FileStream(combinedFile, FileMode.Create, FileAccess.Write);
IWorkbook workbook = new XSSFWorkbook();
var seperator = ";";
foreach (var file in files)
{
ISheet sheet = workbook.CreateSheet(file);
using var sourceFile = new FileStream(file, FileMode.Open, FileAccess.Read);
using TextReader reader = new StreamReader(sourceFile);
var line = await reader.ReadLineAsync();
var i = 0;
while (!string.IsNullOrEmpty(line))
{
var row = sheet.CreateRow(i++);
var values = line.Split(seperator);
for (int j = 0; j < values.Length; j++)
{
var cell = row.CreateCell(j);
cell.SetCellValue(values[j]);
}
} 
}
workbook.Write(target);

还请注意,这只是一个样本。你应该查看文件以了解详细信息。

有多种方法可以做到这一点。一种方法是使用Epplus包。另一个是使用Interop.Excel,它非常简单。有了Interop.Excel,你有了更多的机会(比如你可以使用Excel+创建外接程序等手动做任何事情(。无论如何,使用Interop.Excel,您可以使用CopyFromRecordset((,如果您的文件持久化为QueryTables.Add((,则使用CopyFromRecordset((甚至更好

using ADODB;
using Excel=Microsoft.Office.Interop.Excel;
void Main()
{
Excel.Application xl = new Excel.Application();
var wb = (Excel.Workbook)xl.Workbooks.Add();
//xl.Visible = true;
ConnectionClass cn = new ConnectionClass();
string path = @"c:tempmyCSVFiles";
string[] filenames = { "1.csv", "2.csv", "3.csv", "4.csv" };
string connectionString = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={path};Extended Properties=""text;HDR=Yes;FMT=Delimited"";";
cn.Open(connectionString, "", "", 0);

for (int i = 0; i < filenames.Length; i++)
{
if (i > 0 && wb.Worksheets.Count < i + 1) {
wb.Worksheets.Add(After: wb.Worksheets[i]);
}
var ws = (Excel.Worksheet)wb.Worksheets[i+1];
RecordsetClass rs = new RecordsetClass();
string filename = filenames[i];
rs.Open($@"select * from {filename}",
cn,
CursorTypeEnum.adOpenUnspecified,
LockTypeEnum.adLockUnspecified, 0);
ws.Activate();
Excel.Range rng = ws.Range["A1"];
for (int j = 0; j < rs.Fields.Count; j++)
{
rng.Offset[0, j].Value2 = rs.Fields[j].Name;
rng.Offset[0, j].Font.Bold = true;
}
rng.Offset[1, 0].CopyFromRecordset(rs);
ws.UsedRange.Columns.AutoFit();
rs.Close();
}
cn.Close();
wb.SaveAs(@"c:tempMyCSVStore.xlsx");
wb.Close(SaveChanges:true);


xl.Quit();
}

最新更新