1

ボタンをクリックすると、datagridview のすべてのデータが Excel ファイルにエクスポートされるように、エクスポート関数を作成しました。これで 1 つの問題が発生します。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 ファイルに含まれる列の幅を定義するにはどうすればよいですか? すべての列をはるかに広くしたい。

4

2 に答える 2

3

Office Interopを使わずにやりたいことができるとは思えません。.NET 4.0 では、Excel の相互運用性がそれほど悪くないことがわかります。たとえば、列の自動調整を行うには、次のようになります。

worksheet.Cells.Style.EntireColumn.AutoFit()

Office Interoperability for Excel の優れたスターターは、ここにあります。

編集: Office Interop に代わるものがあります。davmos の回答を参照してください。

于 2013-05-15T14:07:32.063 に答える