将列表导出到 Excel

本文关键字:Excel 列表 | 更新日期: 2023-09-27 17:56:50

所以我有一个数据列表,我正在尝试导出到 excel。我只想在第 1 列列出它,但它拒绝了。我最初打算使用 foreach 循环,但我担心这会减慢我的程序速度,并且我无法使用我的 for 循环想法。有没有人有任何好主意来导入这个。我觉得它不应该像我做的那么难。这就是我到目前为止所做的。提前谢谢。

if (dialog == DialogResult.Yes)
{
    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    Workbook wb = excel.Workbooks.Add(XlSheetType.xlWorksheet);
    Worksheet ws = (Worksheet)excel.ActiveSheet;
    ws.Cells[1, 1] = "Folder Names";
    for (int row = 0; row <= count; row++)
    {
        ws.Cells [1, row+2] = Namelist;
    }
    excel.Visible = true;
}

我也想按顺序进入列表。(上面的代码不会导出名称列表,其余的都可以)

名称列表 = 列表int count(这是我在程序前面启动的计数器,用于确定 Namelist 的行数)

将列表导出到 Excel

如果 Namelist List<string> ,最简单的方法是将其复制到剪贴板:

var text = "Folder Names'n" + string.Join("'n", Namelist);    // or "'r'n"
System.Windows.Forms.Clipboard.SetText(text);
var xl = new Microsoft.Office.Interop.Excel.Application();
var wb = xl.Workbooks.Add();
var ws = xl.ActiveSheet as Worksheet;
ws.Range("A1").PasteSpecial();
xl.Visible = true;

甚至更容易,因为默认情况下 Excel 与.csv文件相关联:

var fileName = @"list.csv";    // or change to .xls and get warning message box
System.IO.File.WriteAllText(fileName, "Folder Names'n" + string.Join("'n", Namelist)); 
System.Diagnostics.Process.Start(fileName);

更新

CSV 代表逗号分隔值,

因此如果您希望列表位于不同的列中,则必须在值之前添加逗号。例如在第 2 列和第 4 列中:

,Folder Names,,Folder Size
,name1,,256
,name2,,"1,024"

如果您有 2 个大小相同的列表,则可以将它们压缩在一起:

string[] names = {"name1", "name2"}; 
int[] sizes = {256, 1024};
var lines = names.Zip(sizes, (name, size) => name + "," + size); // {"name1,256", "name2,1024"}
var csv = "Names,Sizes'n" + string.Join("'n", lines);

for循环不会减慢程序的速度,但单独访问单元格会减慢速度。 对Cells的每个调用都是一个 COM 互操作调用,这相对昂贵。 将数据放入数组中,定义一个表示整个输出范围的Range,并在其中设置Value要快得多

Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
var wbs = excel.Workbooks;
Workbook wb = wbs.Add(XlSheetType.xlWorksheet);
Worksheet ws = (Worksheet)excel.ActiveSheet;
List<object> data = new List<object>
data.Add("Folder Names");
for (int row = 0; row <= count; row++)
{
    data.Add(Namelist);
}
Excel.Range rng = (Excel.Range)ws.Range[ws.Cells[1, 1], ws.Cells[1,count + 2]];
rng.Value = data.ToArray();
excel.Visible = true;

假设Nameliststring[]List<string>您缺少的是在设置每个单元格的值之前从Namelist集合中提取每个项目:

ws.Cells[1, 1] = @"Folder names";
for(int row = 2; row <= count; row ++)
{
    var name = Namelist[row-2];
    ws.Cells[1, row] = name;
}

使用 Cells 属性时,第一个参数是行,第二个参数是列。你把它颠倒了。

另外,如果你在学习Excel互操作的道路上没有走得太远,我会切换到EPPlus。它的使用简单性提高了 100 倍,不涉及弄乱 COM 对象,甚至不需要 Excel。只是更好。

使用

c# 将列表导出到 excel 的超级简单方法

如何使用 NuGet Packager Manager 控制台安装 ClosedXML: PM>获取项目 [项目名称] |安装包已关闭XML

using (var conn = new DB.Entities())
{
    var stories = (from a in conn.Subscribers
                   orderby a.DT descending
                   select a).Take(100).ToList();
    var ShowHeader = true;
    PropertyInfo[] properties = stories.First().GetType().GetProperties();
    List<string> headerNames = properties.Select(prop => prop.Name).ToList();                
    var wb = new XLWorkbook();
    var ws = wb.Worksheets.Add("Subscribers");
    if (ShowHeader)
    {
        for (int i = 0; i < headerNames.Count; i++)                    
            ws.Cell(1, i + 1).Value = headerNames[i];
        ws.Cell(2, 1).InsertData(stories);
    }
    else
    {
        ws.Cell(1, 1).InsertData(stories);
    }
    wb.SaveAs(@"C:'Testing'yourExcel.xlsx");
}