首页 > 杂文归档 正文
C#中DataGridView导出Excel的两种方法

 2021-01-13 18:00:03     

第一种是用数据流导出:


#region
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
sav

第一种是用数据流导出:

#region
      SaveFileDialog saveFileDialog = new SaveFileDialog();
      saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
      saveFileDialog.FilterIndex = 0;
      saveFileDialog.RestoreDirectory = true;
      saveFileDialog.CreatePrompt = true;
      saveFileDialog.Title = "Export Excel File";
      saveFileDialog.ShowDialog();
      if (saveFileDialog.FileName == "")
return;
      Stream myStream;
      myStream = saveFileDialog.OpenFile();
      StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
 
      string str = "";
      try
      {
for (int i = 0; i < dataGridView1.ColumnCount; i++)
{
  if (i > 0)
  {
    str += "\t";
  }
  str += dataGridView1.Columns[i].HeaderText;
}
sw.WriteLine(str);
for (int j = 0; j < dataGridView1.Rows.Count; j++)
{
  string tempStr = "";
  for (int k = 0; k < dataGridView1.Columns.Count; k++)
  {
    if (k > 0)
    {
      tempStr += "\t";
    }
    tempStr += dataGridView1.Rows[j].Cells[k].Value.ToString();
  }
  sw.WriteLine(tempStr);
}
sw.Close();
myStream.Close();
      }
 
      catch (Exception ex)
      {
https://MessageBox.Show(ex.ToString());
      }
      finally
      {
sw.Close();
myStream.Close();
      }
#endregion

这种方法的优点就是导出比较快,但是excel的表格里面设置标题,字体样式等都不能弄,因为你是用数据流直接导出为excel的,除非你能在数据流中设置这些样式,这个我还没这本事,哪位大哥会的教一下...嘿嘿

第二种方法是直接写一个类,这个类直接操作EXCEL的:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Text;
using System.Diagnostics;
using System.IO;
using Microsoft.Office.Interop.Excel;
 
namespace Excel
{
  public class Export
  {
    https:/// <summary>
    https:/// DataGridView导出Excel
    https:/// </summary>
    https:/// <param name="strCaption">Excel文件中的标题</param>
    https:/// <param name="myDGV">DataGridView 控件</param>
    https:/// <returns>0:成功;1:DataGridView中无记录;2:Excel无法启动;9999:异常错误</returns>
    public int ExportExcel(string strCaption, DataGridView myDGV, SaveFileDialog saveFileDialog)
    {
      int result = 9999;
      
      https://保存
      
      saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
      saveFileDialog.FilterIndex = 0;
      saveFileDialog.RestoreDirectory = true;
      https://saveFileDialog.CreatePrompt = true;
      saveFileDialog.Title = "Export Excel File";
      if ( saveFileDialog.ShowDialog()== DialogResult.OK)
      {
if (saveFileDialog.FileName == "")
{
  MessageBox.Show("请输入保存文件名!");
  saveFileDialog.ShowDialog();
}
  https:// 列索引,行索引,总列数,总行数
int ColIndex = 0;
int RowIndex = 0;
int ColCount = myDGV.ColumnCount;
int RowCount = myDGV.RowCount;
 
if (myDGV.RowCount == 0)
{
  result = 1;
}
 
https:// 创建Excel对象
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
if (xlApp == null)
{
  result = 2;
}
try
{
  https:// 创建Excel工作薄
  Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
  Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];
  https:// 设置标题
  Microsoft.Office.Interop.Excel.Range range = xlSheet.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, ColCount]); https://标题所占的单元格数与DataGridView中的列数相同
  range.MergeCells = true;
  xlApp.ActiveCell.FormulaR1C1 = strCaption;
  xlApp.ActiveCell.Font.Size = 20;
  xlApp.ActiveCell.Font.Bold = true;
  xlApp.ActiveCell.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
  https:// 创建缓存数据
  object[,] objData = new object[RowCount + 1, ColCount];
  https://获取列标题
  foreach (DataGridViewColumn col in myDGV.Columns)
  {
    objData[RowIndex, ColIndex++] = col.HeaderText;
  }
  https:// 获取数据
  for (RowIndex = 1; RowIndex < RowCount; RowIndex++)
  {
    for (ColIndex = 0; ColIndex < ColCount; ColIndex++)
    {
      if (myDGV[ColIndex, RowIndex - 1].ValueType == typeof(string)
|| myDGV[ColIndex, RowIndex - 1].ValueType == typeof(DateTime))https://这里就是验证DataGridView单元格中的类型,如果是string或是DataTime类型,则在放入缓存时在该内容前加入" ";
      {
objData[RowIndex, ColIndex] = "" + myDGV[ColIndex, RowIndex - 1].Value;
      }
      else
      {
objData[RowIndex, ColIndex] = myDGV[ColIndex, RowIndex - 1].Value;
      }
    }
    System.Windows.Forms.Application.DoEvents();
  }
  https:// 写入Excel
  range = xlSheet.get_Range(xlApp.Cells[2, 1], xlApp.Cells[RowCount, ColCount]);
  range.Value2 = objData;
 
  xlBook.Saved = true;
  xlBook.SaveCopyAs(saveFileDialog.FileName);
}
catch (Exception err)
{
  result = 9999;
}
finally
{
  xlApp.Quit();
  GC.Collect(); https://强制回收
}
https://返回值
result = 0;
      }
      
      return result;
    }
 
 
  }
}

这个优点是能设置样式什么的。缺点就是导出速度慢...

以上两种方法都是参考了很多料的..写在这里以便于相互学习..

补充一下:用第二种方法导出excel会有格式方面的变化,比如身份证号码按科学计算法导出了,不是按原先的模型

改进方法是在写入excel时添加一个格式声明:range.NumberFormatLocal = "@";

如:https:// 写入Excel

range = xlSheet.get_Range(xlApp.Cells[2, 1], xlApp.Cells[RowCount + 2, ColCount]);
range.NumberFormatLocal = "@";
range.Value2 = objData;

原文链接:http://www.yuepc.com/a/1760.html

http://www.yuepc.com 为 “沈一博客” 唯一官方服务平台,请勿相信其他任何渠道。