Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C#列表导出到Excel_C#_.net_Excel_List_Generic List - Fatal编程技术网

将C#列表导出到Excel

将C#列表导出到Excel,c#,.net,excel,list,generic-list,C#,.net,Excel,List,Generic List,使用C#,是否有直接的方法将列表列表(即,List)导出到Excel 2003 我正在解析大型文本文件并导出到Excel。一次写入一个单元格会产生太多的开销。我选择使用List,这样就不必担心指定行数或列数 目前,我一直等到文件结束,然后将我的列表的内容放入一个二维数组中。然后可以将数组设置为Excel.Range对象的值。它是有效的,但似乎我应该能够获取列表列表,而不必担心行数或列数,只需将其从A1转储到工作表中的任意位置 下面是我想替换或改进的代码片段: object oOpt = Syst

使用C#,是否有直接的方法将列表列表(即,
List
)导出到Excel 2003

我正在解析大型文本文件并导出到Excel。一次写入一个单元格会产生太多的开销。我选择使用
List
,这样就不必担心指定行数或列数

目前,我一直等到文件结束,然后将我的
列表的内容放入一个二维数组中。然后可以将数组设置为Excel.Range对象的值。它是有效的,但似乎我应该能够获取列表列表,而不必担心行数或列数,只需将其从A1转储到工作表中的任意位置

下面是我想替换或改进的代码片段:

object oOpt = System.Reflection.Missing.Value; //for optional arguments
Excel.Application oXL = new Excel.Application();
Excel.Workbooks oWBs = oXL.Workbooks;
Excel._Workbook oWB = oWBs.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel._Worksheet oSheet = (Excel._Worksheet)oWB.ActiveSheet;

int numberOfRows = outputRows.Count;
int numberOfColumns = int.MinValue;

//outputRows is a List<List<object>>
foreach (List<object> outputColumns in outputRows)
{
        if (numberOfColumns < outputColumns.Count)
        { numberOfColumns = outputColumns.Count; }
}

Excel.Range oRng = oSheet.get_Range("A1", oSheet.Cells[numberOfRows,numberOfColumns]);

object[,] outputArray = new object[numberOfRows,numberOfColumns];

for (int row = 0; row < numberOfRows; row++)
{
        for (int col = 0; col < outputRows[row].Count; col++)
        {
                outputArray[row, col] = outputRows[row][col];
        }
}

oRng.set_Value(oOpt, outputArray);

oXL.Visible = true;
oXL.UserControl = true;
object oOpt=System.Reflection.Missing.Value//对于可选参数
Excel.Application oXL=新的Excel.Application();
Excel.Workbooks oWBs=oXL.Workbooks;
Excel.\u工作簿oWB=oWBs.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.\u工作表oSheet=(Excel.\u工作表)oWB.ActiveSheet;
int numberOfRows=outputRows.Count;
int numberOfColumns=int.MinValue;
//outputRows是一个列表
foreach(列出outputRows中的outputColumns)
{
if(numberOfColumns
这是可行的,但我宁愿直接将列表用于Excel,而不是仅仅为了Excel而创建数组的中间步骤。有什么想法吗?

将二维数组传递给Excel要比一次更新一个单元格快得多


使用列表列表中的值创建一个二维对象数组,将Excel范围重新定为数组的维度,然后调用range.set_Value,传递二维数组。

从策略上讲,这样做是正确的。正如Joe所说,通过一次传递整个值数组来执行单元格值分配比通过逐个循环单元格来执行要快得多

Excel基于COM,因此通过.NET互操作与Excel一起操作。不幸的是,互操作对泛型一无所知,因此不能向其传递列表或类似的内容。二维数组确实是唯一的方法

也就是说,有几种方法可以清理代码,使其更易于管理。以下是一些想法:

(1) 如果您使用的是.NET 3.0,则可以使用LINQ将代码缩短为:

int numberOfColumns = int.MinValue;

foreach (List<object> outputColumns in outputRows)
{
        if (numberOfColumns < outputColumns.Count)
        { numberOfColumns = outputColumns.Count; }
}
(2) 不要使用
\u工作表
\u工作簿
界面。使用
工作表
工作簿
。有关讨论,请参见此处:

(3)考虑使用<代码>范围。调整大小< /COD>方法,该方法以<代码>范围。这是一个折腾,虽然-我实际上喜欢你的方式设置你的范围大小。但这是我认为你可能想知道的事情。例如,您在此处的行:

Excel.Range oRng = oSheet.get_Range("A1", oSheet.Cells[numberOfRows,numberOfColumns]);
可更改为:

Excel.Range oRng = 
    oSheet.get_Range("A1", Type.Missing)
        .get_Resize(numberOfRows, numberOfColumns);
(4) 您不必将
应用程序.UserControl
设置为
true
。让Excel对用户可见就足够了。
UserControl
属性的作用与您认为的不同。(请参阅帮助文件)如果要控制用户是否可以控制Excel,应使用工作表保护,或者如果要锁定用户,可以设置
Application.Interactive=false
。(很少是个好主意。)但是如果你想让用户使用Excel,那么简单地让它可见就足够了

总的来说,考虑到这些,我认为您的代码可以如下所示:

object oOpt = System.Reflection.Missing.Value; //for optional arguments
Excel.Application oXL = new Excel.Application();
Excel.Workbooks oWBs = oXL.Workbooks;
Excel.Workbook oWB = oWBs.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Worksheet oSheet = (Excel.Worksheet)oWB.ActiveSheet;

//outputRows is a List<List<object>>
int numberOfRows = outputRows.Count;
int numberOfColumns = outputRows.Max(list => list.Count);

Excel.Range oRng = 
    oSheet.get_Range("A1", oOpt)
        .get_Resize(numberOfRows, numberOfColumns);

object[,] outputArray = new object[numberOfRows, numberOfColumns];

for (int row = 0; row < numberOfRows; row++)
{
    for (int col = 0; col < outputRows[row].Count; col++)
    {
        outputArray[row, col] = outputRows[row][col];
    }
}

oRng.set_Value(oOpt, outputArray);

oXL.Visible = true;
object oOpt=System.Reflection.Missing.Value//对于可选参数
Excel.Application oXL=新的Excel.Application();
Excel.Workbooks oWBs=oXL.Workbooks;
Excel.Workbook oWB=oWBs.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Worksheet oSheet=(Excel.Worksheet)oWB.ActiveSheet;
//outputRows是一个列表
int numberOfRows=outputRows.Count;
int numberOfColumns=outputRows.Max(list=>list.Count);
Excel.Range oRng=
oSheet.get_范围(“A1”,oOpt)
.get_Resize(numberOfRows,numberOfColumns);
对象[,]输出阵列=新对象[numberOfRows,numberOfColumns];
for(int row=0;row
希望这有助于

Mike

列出getreport=cs.getcompletionreport();
var getreport=getreport.Select(c=>new{demographic=c.rName);
希望这有帮助


其中,
cs.getcompletionreport()
是参考类文件,是应用程序的业务层

供未来搜索者使用:确实,如果要将列表复制到excel,您必须粘贴
对象[,]
(二维)。万一有人有一维列表,您可以使用第二维度1:

List<DateTime> listDate; //I'm filling it with data from datagridview
...
object[,] outDate = new object[listDate.Count, 1];
for(int row = 0; row < listDate.Count; row++)
{
    outDate[row, 0] = listDate[row];
}
List listDate;//我正在用datagridview中的数据填充它
...
对象[,]过期=新对象[listDate.Count,1];
for(int row=0;row
这就是我目前正在做的事情;但是,如果我打算首先使用
列表
而不是数组,可能会有另一种方法将数据导入Excel,而不必首先将其全部加载到中间数组中。谢谢!虽然我们不在.NET 3.0上,但我非常感谢您的所有澄清。没问题,很高兴有帮助
List<"classname"> getreport = cs.getcompletionreport();

var getreported = getreport .Select(c => new { demographic = c.rName);
List<DateTime> listDate; //I'm filling it with data from datagridview
...
object[,] outDate = new object[listDate.Count, 1];
for(int row = 0; row < listDate.Count; row++)
{
    outDate[row, 0] = listDate[row];
}