【问题标题】:Changing column widths of excel when exporting data to Excel file [C#]将数据导出到 Excel 文件时更改 excel 的列宽 [C#]
【发布时间】:2013-05-10 03:02:30
【问题描述】:

我写了一个导出函数,以便我的 datagridview 中的所有数据 当我点击一个按钮时,它被导出到一个 Excel 文件中。 现在这给我带来了一个问题,我想定义我的 excel 列的列宽。 在我打开 Excel 的那一刻,我总是在日期列中得到 ########。 这也是由于列不够宽。

它在 Excel 中的外观示例:

所以不用多说,这是我的代码。

private void excelToolStripMenuItem_Click(object sender, EventArgs e)
{
    SaveFileDialog sfd = new SaveFileDialog();

    sfd.Filter = "Excel Documents (*.xls)|*.xls";

    sfd.FileName = "reminders_MM.xls"; // Default File Name

    if (sfd.ShowDialog() == DialogResult.OK)
    {
        ToCsV(dataGridViewReminders, sfd.FileName);
    }
    MessageBox.Show("Alle data is succesvol geëxporteerd!", "Voltooid", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

private void ToCsV(DataGridView dgv, string filename)
{
    string stOutput = "";
    // Export titles:
    string sHeaders = "";

    for (int j = 2; j < dgv.Columns.Count; j++)
        sHeaders = sHeaders.ToString() + Convert.ToString(dgv.Columns[j].HeaderText) + "\t";
        stOutput += sHeaders + "\r\n";
        // Export data.
        for (int i = 0; i <= dgv.RowCount - 1; i++)
        {
            string stLine = "";
            for (int j = 2; j < dgv.Rows[i].Cells.Count; j++)
                stLine = stLine.ToString() + Convert.ToString(dgv.Rows[i].Cells[j].Value) + "\t";
                stOutput += stLine + "\r\n";
            }
        }  
    }

    Encoding utf16 = Encoding.GetEncoding(1254);
    byte[] output = utf16.GetBytes(stOutput);
    FileStream fs = new FileStream(filename, FileMode.Create);
    BinaryWriter bw = new BinaryWriter(fs);
    bw.Write(output, 0, output.Length); //write the encoded file
    bw.Flush();
    bw.Close();
    fs.Close();
}

问题很简单。如何定义将进入我的 Excel 文件的列的宽度?我希望每一列都更宽。

【问题讨论】:

  • 您不能,因为您实际上并没有创建 Excel 文件,而是创建了 Excel 将打开的 CSV 文件,并且您无法控制 Excel 如何处理 CSV 文件。唯一的方法是创建一个实际的 Excel 文件,例如使用 NPOI
  • 所以没有单一的方法可以控制这些列宽? ://

标签: c# datagridview export-to-excel column-width


【解决方案1】:

我不相信有办法不使用Office Interop 来做你想做的事。使用 .NET 4.0,您会发现 Excel 互操作并没有那么糟糕。例如,要完成列的自动调整,它看起来像这样。

worksheet.Cells.Style.EntireColumn.AutoFit()

可以在here 找到一个优秀的 Office Interoperability for Excel starter。

编辑:Office Interop 有一个替代方案。请参阅 davmos 的回答。

【讨论】:

  • 谢谢你,nathan,今晚试试看!
【解决方案2】:

如果您使用的是 Excel 2007 或更高版本,COM Interop 的首选替代方案是Open XML SDKUsing C# and Open XML SDK 2.0 for Microsoft Office to Create an Excel 2007 Document 有一个很好的演练。

【讨论】:

  • :) 也为你 +1。我不知道互操作在 .NET 4.0 中有所改进,但那是因为我们现在尽可能避免它。
猜你喜欢
  • 2013-02-27
  • 2017-03-02
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多