我的数据网格视图中有10k行和15列 . 我想将此数据导出到excel表单o按钮 . 我已经尝试过以下代码 .
private void btExport_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
app.Visible = true;
worksheet = workbook.Sheets["Sheet1"];
worksheet = workbook.ActiveSheet;
for(int i=1;i<dataGridView1.Columns.Count+1;i++)
{
worksheet.Cells[1, i] = dataGridView1.Columns[i-1].HeaderText;
}
for (int i=0; i < dataGridView1.Rows.Count-1 ; i++)
{
for(int j=0;j<dataGridView1.Columns.Count;j++)
{
if (dataGridView1.Rows[i].Cells[j].Value != null)
{
worksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
}
else
{
worksheet.Cells[i + 2, j + 1] = "";
}
}
}
}
这对我有用,但 it is taking lots of time to 完成导出过程 .
Is it possible to export from dataGridView (with 10k rows)to excel instantly on a button click?
除此之外,当我尝试将所有dataGridview内容复制到剪贴板然后手动将其粘贴到Excel工作表时,它几乎立即发生 .
So is there a way to copy all dataGridView cells to clip board and paste it to excel sheet(with cell formatting) on a button click?
我有如下复制到剪贴板的代码,但我不知道如何通过打开它将其粘贴到新的Excel工作表中 .
private void copyAllToolStripMenuItem_Click(object sender, EventArgs e)
{
dataGridView1.SelectAll();
DataObject dataObj = dataGridView1.GetClipboardContent();
if (dataObj != null)
Clipboard.SetDataObject(dataObj);
}
请帮忙举个例子 . 我是C#的新手 .
11 回答
我通过简单的复制和粘贴方法解决了这个问题我不知道这是最好的方法,但对我而言,它的效果很好,而且几乎是即时的 . 这是我的代码 .
谢谢 .
这是一个很好的问题,我很惊讶找到一个清晰而完整的答案是多么困难,我发现的大部分答案都是sudo-code或者不是100%完成 .
我能够创建一个完整的解决方案,根据Jake的答案将数据从我的DataGridView复制并保存到excel文件,所以我发布了我的完整解决方案,希望它可以帮助其他新来者像我这样的c#:)
首先,您需要在项目中使用
Microsoft.Office.Interop.Excel
引用 . 有关如何添加它,请参见MSDN .我的代码:
我不打算偷@Jake和@ Cornelius的答案,所以我尝试编辑它 . 但它被拒绝了 . 无论如何,我必须指出的唯一改进是关于在粘贴后避免excel中的额外空白列 . 添加一行
dataGridView1.RowHeadersVisible = false;
会隐藏所谓的"Row Header",它出现在DataGridView的最左侧,因此当您执行dataGridView1.SelectAll();
时,它不会被选中并复制到剪贴板Interop很慢并且有其他问题,使用剪贴板似乎是不可扩展的 . 以下是另外两种方法
直接使用Excel 2007文件而不是使用Excel,它会更快(更快) . 您可以使用Microsoft的SDK OpenXML(http://openxmldeveloper.org/) . 学习OpenXML的最好方法是下载Productivity工具(http://www.microsoft.com/en-us/download/details.aspx?id=5124),它创建一个现有文件并生成创建它所需的代码 . 另一个,也许更简单,选项是使用ClosedXML(http://closedxml.codeplex.com/) . 它似乎更容易使用(看一下示例http://closedxml.codeplex.com/wikipage?title=Showcase&referringTitle=Home),但我没有使用它的经验 . 我确信还有其他库可以用Excel包装 .
通过OLEDB使用excel . 这允许您使用Excel,就好像它是一个dababase . 有关示例和更多详细信息,请参阅http://www.codeproject.com/Articles/8500/Reading-and-Writing-Excel-using-OLEDB或Performance of OLEDB to read Excel .
我将从ClosedXML开始 .
最好用的是使用closedxml.codeplex.com Library.Refer it @ https://closedxml.codeplex.com/wikipage?title=Adding%20DataTable%20as%20Worksheet&referringTitle=Documentation
我喜欢杰克的解决方案 . 通过执行以下操作可以解决没有标头的问题
当然,只有你知道 Headers 应该提前是什么才有效 .
这就是我用于我的gridview,尝试将它用于你的数据,它完美地工作:
这个答案是第一个问题,为什么需要这么多时间,它提供了一个替代解决方案,用于将DataGridView导出到Excel .
MS Office Interop很慢,甚至Microsoft也不建议在服务器端使用Interop,也不能用于导出大型Excel文件 . 有关详细信息,请参阅Microsoft的观点why not to use OLE Automation .
Interop以XLS文件格式(旧的Excel 97-2003文件格式)保存Excel文件,并且对Office 2003的支持已结束 . Microsoft Excel使用Office 2007发布了XLSX文件格式,并建议使用OpenXML SDK而不是Interop . 但是XLSX文件实际上并不是那么快,并且不能很好地处理大型Excel文件,因为它们基于XML文件格式 . 这就是为什么Microsoft还发布了Office 2007的XLSB文件格式,这是推荐用于大型Excel文件的文件格式 . 它是二进制格式 . 因此,最好和最快的解决方案是保存XLSB文件 .
您可以使用此C# Excel library来保存XLSB文件,但它也支持XLS和XLSX文件格式 .
请参阅以下代码示例,作为将DataGridView导出到Excel的替代方法:
如果还需要导出DataGridView的格式,请检查此代码示例如何export datagridview to Excel in C# .
此行仅适用于Windows窗体上的DataGridView控件:
这个问题解决了同样的问题,但是对于WPF的DataGrid控件框架:
如果您的DataGridView的
RightToLeft
设置为Yes
,那么您的数据将反向复制 . 因此,您应该使用以下代码正确复制数据 .