0

我有这段代码使用 c# 从 1 listview 导出一个 excel 文件。我现在的问题是,如果我有 2 个列表视图将在 1 个 excel 文件中生成,我的计划是 listview1 用于 sheet1,而 listview2 用于 sheet2。

这是我的代码生成 listview1 以 excel 进入 sheet1:

string[] st = new string[listView1.Columns.Count];
DirectoryInfo di = new DirectoryInfo(Environment.ExpandEnvironmentVariables("%USERPROFILE%") + @"\Desktop\");
if (di.Exists == false)
    di.Create();
fileName f = new fileName();
if (f.ShowDialog() == DialogResult.OK)
{
    StreamWriter sw = new StreamWriter(Environment.ExpandEnvironmentVariables("%USERPROFILE%") + @"\Desktop\" + f.Filenam + ".xls", false);
    sw.AutoFlush = true;
    string header = "";
    for (int col = 0; col < listView1.Columns.Count; col++)
    {
        header += listView1.Columns[col].Text.ToString() + "\t";
    }
    sw.Write(header);
    int rowIndex = 1;
    int row = 0;
    string st1 = "";
    for (row = 0; row < listView1.Items.Count; row++)
    {
        if (rowIndex <= listView1.Items.Count)
            rowIndex++;

        st1 = "\n";

        for (int col = 0; col < listView1.Columns.Count; col++)
        {
            st1 = st1 + listView1.Items[row].SubItems[col].Text.ToString() + "\t";
        }
        sw.Write(st1);
    }
    sw.Close();
    FileInfo fil = new FileInfo(Environment.ExpandEnvironmentVariables("%USERPROFILE%") + @"\Desktop\" + f.Filenam + ".xls");
    if (fil.Exists == true)
        MessageBox.Show("Process Completed", "Export to Excel", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
4

3 回答 3

3

我使用过EPPlus,它是免费的,具有性能优势,并提供了许多 Excel 功能。您可以寻找的其他选项是Microsoft InterOp for Excel 导出,但它存在性能问题。

于 2013-07-26T14:18:00.873 回答
1

正如 Irfan 已经提到的,你可以这样做Microsoft.Office.Interop

Excel.Application xlsApp = new Excel.Application();
Excel.Workbook workbook;
workbook = xlsApp.Workbooks.Open(configuration.XLSExportedFile, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
foreach (Excel.Worksheet sheet in workbook.Sheets)
{
      workbook.Activate();
      sheet.Activate();
}

这将帮助您逐步浏览 Excel 文件中的所有工作表。现在,如果您想用多个工作表扩展它,您可以阅读C# 如何以编程方式添加 Excel 工作表 Office XP / 2003以了解如何添加其他工作表。

您现在可以做的是将您的文本放入一个变量中,例如 HTML 或列表框中的任何类型的信息。

string html = Clipboard.GetText(TextDataFormat.Html);

现在您可以使用剪贴板(替代解决方案,但要避免)。

Clipboard.SetText(html);

它实际上将信息输入到您的剪贴板中,您可以做的是将所有列表框值传递到剪贴板中。

现在最后一步是将其粘贴到您想要的位置。

sheet.Range(cellmapp).PasteSpecial();

cellmap例如 A1 应该在哪里。如果列表框中的文本太长,您可以调整行/列。

//Auto fits all columns and rows
//https://stackoverflow.com/questions/14748322/c-sharp-autofit-method-for-excel-sheet
sheet.Columns.AutoFit();
sheet.Rows.AutoFit();

不要忘记,如果您使用COM进程,请关闭每个对象和文件。

workbook.SaveAs(configuration.XLSExportedFile);
workbook.Close();
xlsApp.Quit();
xlsApp.Dispose();

我并不是说这将是最好的解决方案,但您也可以查找OpenXML

于 2013-07-26T14:46:50.610 回答
0

我以前使用过ClosedXML,语法非常简洁,只需几行即可完成此类任务

此块显示如何将列表添加到新工作表并保存

List<string> list = new List<string>();
var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell(1, 1).Value = list;
workbook.SaveAs("HelloWorld.xlsx");
于 2013-07-26T14:51:40.047 回答