将列表导出到 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 的行数)
如果 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;
假设Namelist
是string[]
或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");
}