输出DatagridView在xls for openOffice Calc

我有这个function,在Excel表中导出一个datagridView:

public void ExportGridToExcel(DataGridView TheGrid, string FileName) { using (System.IO.StreamWriter fs = new System.IO.StreamWriter(FileName, false)) { fs.WriteLine("<?xml version=\"1.0\"?>"); fs.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>"); fs.WriteLine("<ss:Workbook xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">"); fs.WriteLine(" <ss:Styles>"); fs.WriteLine(" <ss:Style ss:ID=\"1\">"); fs.WriteLine(" <ss:Font ss:Bold=\"1\"/>"); fs.WriteLine(" </ss:Style>"); fs.WriteLine(" </ss:Styles>"); fs.WriteLine(" <ss:Worksheet ss:Name=\"Sheet1\">"); fs.WriteLine(" <ss:Table>"); for (int x = 0; x <= TheGrid.Columns.Count - 1; x++) { fs.WriteLine(" <ss:Column ss:Width=\"{0}\"/>", TheGrid.Columns[x].Width); } fs.WriteLine(" <ss:Row ss:StyleID=\"1\">"); for (int i = 0; i <= TheGrid.Columns.Count - 1; i++) { fs.WriteLine(" <ss:Cell>"); fs.WriteLine(string.Format(" <ss:Data ss:Type=\"String\">{0}</ss:Data>", TheGrid.Columns[i].HeaderText)); fs.WriteLine(" </ss:Cell>"); } fs.WriteLine(" </ss:Row>"); for (int intRow = 0; intRow <= TheGrid.RowCount - 2; intRow++) { fs.WriteLine(string.Format(" <ss:Row ss:Height =\"{0}\">", TheGrid.Rows[intRow].Height)); for (int intCol = 0; intCol <= TheGrid.Columns.Count - 1; intCol++) { fs.WriteLine(" <ss:Cell>"); fs.WriteLine(string.Format(" <ss:Data ss:Type=\"String\">{0}</ss:Data>", (TheGrid.Rows[intRow].Cells[intCol].Value != null) ? TheGrid.Rows[intRow].Cells[intCol].Value.ToString() : string.Empty)); fs.WriteLine(" </ss:Cell>"); } fs.WriteLine(" </ss:Row>"); } fs.WriteLine(" </ss:Table>"); fs.WriteLine(" </ss:Worksheet>"); fs.WriteLine("</ss:Workbook>"); } } 

如果我尝试用Microsoft Excel打开生成的XLS一切正常,但如果尝试用OpenOffice Calc打开,给我一个导入屏幕,我不能打开spredsheet。

为什么? 我怎样才能导出一个Excel表单兼容openoffice calc?

首先,你似乎将xml文件保存为xls。 Microsoft Excel可以打开xml文件,而Calc可能不能。 我build议你使用Excel对象创buildexcelsheet,然后尝试在Calc中打开它。 这个例子可能有帮助。

我会想象你有,但我想知道如果你已经考虑出口到CSV格式。 OpenOffice和Excel(以及其他任何可以导入CSV的文件)都可以打开文件,但是可能会丢失一些格式选项。

请find您需要closures文件streamfs.close()的工作代码

StreamWriter fs = new StreamWriter(Application.StartupPath +“\ Export.xls”,false);

  fs.WriteLine("<?xml version=\"1.0\"?>"); fs.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>"); fs.WriteLine("<ss:Workbook xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">"); fs.WriteLine(" <ss:Styles>"); fs.WriteLine(" <ss:Style ss:ID=\"1\">"); fs.WriteLine(" <ss:Font ss:Bold=\"1\"/>"); fs.WriteLine(" </ss:Style>"); fs.WriteLine(" </ss:Styles>"); fs.WriteLine(" <ss:Worksheet ss:Name=\"Sheet1\">"); fs.WriteLine(" <ss:Table>"); for (int x = 0; x <= dgvReport.Columns.Count - 1; x++) { fs.WriteLine(" <ss:Column ss:Width=\"{0}\"/>", dgvReport.Columns[x].Width); } fs.WriteLine(" <ss:Row ss:StyleID=\"1\">"); for (int i = 0; i <= dgvReport.Columns.Count - 1; i++) { fs.WriteLine(" <ss:Cell>"); fs.WriteLine(string.Format(" <ss:Data ss:Type=\"String\">{0}</ss:Data>", dgvReport.Columns[i].HeaderText)); fs.WriteLine(" </ss:Cell>"); } fs.WriteLine(" </ss:Row>"); for (int intRow = 0; intRow <= dgvReport.RowCount - 2; intRow++) { fs.WriteLine(string.Format(" <ss:Row ss:Height =\"{0}\">", dgvReport.Rows[intRow].Height)); for (int intCol = 0; intCol <= dgvReport.Columns.Count - 1; intCol++) { fs.WriteLine(" <ss:Cell>"); fs.WriteLine(string.Format(" <ss:Data ss:Type=\"String\">{0}</ss:Data>", (dgvReport.Rows[intRow].Cells[intCol].Value != null) ? dgvReport.Rows[intRow].Cells[intCol].Value.ToString() : string.Empty)); fs.WriteLine(" </ss:Cell>"); } fs.WriteLine(" </ss:Row>"); } fs.WriteLine(" </ss:Table>"); fs.WriteLine(" </ss:Worksheet>"); fs.WriteLine("</ss:Workbook>"); fs.Close();