none
c#使用StreamWriter导出DataGridView数据到excel中的格式问题 RRS feed

  • 问题

  • c#使用StreamWriter导出DataGridView数据到excel中的格式问题,代码如下:
    private void ExportToExcel(DataGridView dgvGF_IN_INFO)
      {
      SaveFileDialog saveFileDialog = new SaveFileDialog();
      saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
      saveFileDialog.FilterIndex = 0;
      saveFileDialog.RestoreDirectory = true;
      saveFileDialog.CreatePrompt = true;
      saveFileDialog.Title = "保存为Excel文件";
      saveFileDialog.ShowDialog();
      if (saveFileDialog.FileName.IndexOf(":") < 0) return; //被点了"取消"
      Stream myStream;
      myStream = saveFileDialog.OpenFile();
      StreamWriter sw =
      new StreamWriter(myStream, System.Text.Encoding.GetEncoding(0));
      string columnTitle = "";
      try
      {
      //写入列标题
      for (int i = 0; i < dgvGF_IN_INFO.ColumnCount; i++)
      {
      if (i > 0)
      {
      columnTitle += "\t";
      }
      columnTitle += dgvGF_IN_INFO.Columns[i].HeaderText;
      }
      sw.WriteLine(columnTitle);
      //写入列内容
      for (int j = 0; j < dgvGF_IN_INFO.Rows.Count; j++)
      {
      string columnValue = "";
      for (int k = 0; k < dgvGF_IN_INFO.Columns.Count; k++)
      {
      if (k > 0)
      {
      columnValue += "\t";
      }
      if (dgvGF_IN_INFO.Rows[j].Cells[k].Value == null)
      columnValue += "";
      else
      {
      if(k==3)
      columnValue += "\'"+dgvGF_IN_INFO.Rows[j].Cells[k].Value.ToString();
      else
      columnValue += dgvGF_IN_INFO.Rows[j].Cells[k].Value.ToString().Trim();
      }
       
      }
      sw.WriteLine(columnValue);
      }
      sw.Close();
      myStream.Close();
      }
      catch (Exception e)
      {
      MessageBox.Show(e.ToString());
      }
      finally
      {
      sw.Close();
      myStream.Close();
      }
      }
    第3列是文本字段,如0998,但导出后,就变成了998(数字格式了),如何保证原来的格式。我试着加单引号"'",但没用,这样会导致excel的单元格中包含'。
    还有,如果是日期字段,如何进行日期格式化。
    如果不用StreamWriter,用com可以完成,但StreamWriter速度比较快,且不要求装excel。
    请高手指点c#使用StreamWriter导出DataGridView数据到excel中的格式问题,谢谢!

    =====我的尝试:

    如果用
    if(k==3)
      columnValue += "\""+dgvGF_IN_INFO.Rows[j].Cells[k].Value.ToString() + "\"";
    还是原来的情况:0998导出后,就变成了998(数字格式了)
    如果用
    if(k==3)
      columnValue += @"""+dgvGF_IN_INFO.Rows[j].Cells[k].Value.ToString() + @""";
    excel单元格会出现:
    +dgvGF_IN_INFO.Rows[j].Cells[k].Value.ToString()+@

     

    2010年11月1日 7:18

答案

  • 你似乎在利用类似csv的文本格式保存数据,然后利用excel打开,因为csv格式只包含数据,不包括数据类型,因此,你说的问题似乎无法解决(我不确定)。一种可以考虑的替代方案是利用excel支持的xml格式保存数据,这样同样不需要安装excel,同时可以保存丰富的数据类型以及格式信息。

    具体操作方法是,你可以先在excel里面做出一个与你需要的最终导出结果相同的示例文件,然后另存为xml格式(excel菜单中的另存为菜单项),再利用VS等支持xml的编辑器打开生成的xml文件,里面的xml格式相信你稍微花几分钟就能明白,找到其中的数据部分,然后你自己利用代码将你的实际数据做个循环,迭代这个数据部分,利用实际数据替换示例数据。最终你需要的xml格式的excel文件生成。



    理解的越多,需要记忆的就越少
    • 已建议为答案 mazhou 2010年11月1日 11:49
    • 已标记为答案 寂寞沙洲 2010年11月1日 11:56
    2010年11月1日 7:43
    版主