2010-09-10 2 views
2

У меня есть эта функция, экспортировать DataGridView в листе Excel:[C#] Экспорт DataGridView в XLS для OpenOffice Calc

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>"); 
      } 
} 

Если я пытаюсь открыть сгенерированный XLS с Microsoft Excel все в порядке, но если попробовать для открытия с помощью OpenOffice Calc, дайте мне экран импорта, и я не могу открыть файл spredsheet.

Почему? Как я могу сделать для экспорта листа Excel, совместимого с openoffice calc?

ответ

1

Во-первых, кажется, что вы сохраняете xml-файл как xls. Microsoft Excel может открыть файлы xml, тогда как возможно Calc не может. Я предлагаю вам создать excelsheet, используя Excel object, а затем попробуйте открыть его в Calc. Это может помочь example.

+0

Да, но для использования объекта Excel Мне нужно, чтобы Office был установлен на пользовательском компьютере, как я могу проверить, установлен ли офис на компьютер пользователя? – aleroot

+0

@aleroot: Не обязательно, если вы включили ссылку на сборку в выходном файле проекта, вам не понадобится Office для установки на компьютер пользователя. CSV может, однако, быть более легким выбором, если вам нужна совместимость как для excel, так и для calc. –

+0

Нет, вам нужно, чтобы на каждой машине был установлен Excel, иначе вы получите сообщение об ошибке на компоненте COM ... – aleroot

1

Я бы предположил, что у вас есть, но мне интересно, если вы решили экспортировать в формат CSV. И OpenOffice, и Excel (и все, что может импортировать CSV), смогут открыть файл, хотя вы можете потерять некоторые параметры форматирования.

0

пожалуйста, найти этот рабочий код, который нужно закрыть fs.close FileStream()

StreamWriter фс = новый StreamWriter (Application.StartupPath + "\ Export.xls", ложь);

    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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^