【问题标题】:c# ExportToExcel creates corrupted xlsx filec# ExportToExcel 创建损坏的 xlsx 文件
【发布时间】:2016-04-18 17:19:59
【问题描述】:

我正在使用以下库:

http://mikesknowledgebase.azurewebsites.net/pages/CSharp/ExportToExcel.htm

这是我的代码:

private void exportExcelBtn_Click(object sender, EventArgs e)
{
    if (dataGridView1.Rows.Count == 0)
    {
        MessageBox.Show("There's nothing to export", "Info", MessageBoxButtons.OK);
        return;
    }

    DataTable save = Utilities.DataGridView2DataTable(dataGridView1, "TestingReport");

    string outputFile = Utilities.saveDoc(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), save);
    if (outputFile != null)
    {
        DialogResult opt = MessageBox.Show("Export successful. Would you like to view the file?", "Information", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
        if (opt == DialogResult.Yes)
        {
            System.Diagnostics.Process.Start(outputFile);
        }
    }
}

我在两个不同的项目中使用完全相同的代码,但是在一个项目中,它创建的 excel 文件已损坏/无法读取。

在提取 .xlsx 文件的内容时,我注意到的第一件事是工作项目中存在的 [Content_Types].xml 文件不在不工作项目的输出中。此外,创建的 workbook.xml 文件都是 0kb,而工作项目文件中实际上包含数据。

我试过Console.WriteLine

我还使用此代码将我的 DataGridView 转换为 DataTable,以便将其写入 excel:https://www.crealoq.com/solved/how-to-convert-datagridview-to-datatable-using-csharp

我已经完成并添加了Console.WriteLine(...) 以验证数据实际上是从这个函数返回的,并且一切看起来都很好。

编辑:

我注意到的唯一区别是,当我单击按钮保存 excel,然后选择不立即查看时,当我解压缩 excel 文档时,返回有效 excel 文档的应用程序允许我解压缩它,但是当我尝试解压缩 ISN 不起作用的那个时,它说文件当前已打开..

【问题讨论】:

    标签: c# excel datagridview


    【解决方案1】:

    如果您的第一个列标题称为“id”,这可能会导致问题。您可以尝试在任何名为“id”的列前添加“`”

    【讨论】:

      【解决方案2】:

      问题是我更改了CreateExcelFile.cs中的部分代码

      这与完成后不关闭 StreamWriter 的效果相同,然后因此丢失了一堆文本。我更改了这个代码块 b/c 如果没有 WindowsBase.dll,它就无法工作。在引用该 DLL 并将代码改回来后,我能够成功地将我的 datagridview 导出到 excel

      【讨论】:

        【解决方案3】:

        我也用 DataGridView 做了类似的东西。

        首先我从我需要的列中获取值(在我的情况下它只有 1 列)

        List<float> values = new List<float>();
        
        for (int y = 0; y < rows; y++)
           valores.Add(float.Parse(valoresMonitoreo[0, y].Value.ToString()));
        

        然后是导出函数

        private void export()
                {
                    Microsoft.Office.Interop.Excel.Application oXL;
                    Microsoft.Office.Interop.Excel._Workbook oWB;
                    Microsoft.Office.Interop.Excel._Worksheet oSheet;
                    object misvalue = System.Reflection.Missing.Value;
        
                  try
                  {
                      oXL = new Microsoft.Office.Interop.Excel.Application();
                      oXL.Visible = true;
                      oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Open(libro));
                      oWB.Sheets[x].Select(); 
                      //x is the number of the sheet where you want to save data.
                      oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet;
        
        //This goes into a for
        oSheet.get_Range(tmp, misvalue).Value2 = values[x]; //tmp is a string, which contains letter and number of the cell "A1". misvalue is an object variable
            oWB.Save();
                            oWB.Close();
                            oXL.Visible = false;
                            oXL.UserControl = false;
                            oXL.Application.Quit();
            }
            catch(Exception exc){}
            }
        

        您必须使用 Microsoft.Office.Interop.Excel 参考。

        【讨论】:

          【解决方案4】:

          尝试刷新并关闭 HttpResponse 请求。这对我有用。

          response.OutputStream.Flush();
          response.OutputStream.Close();
          response.Flush();
          response.Close();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-27
            • 2020-01-03
            • 2017-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多