导出Excel方法(winform或web)

时间:2024-03-04 20:02:39

一、winform形式导出Excel

  此方法适用于winform项目导出Excel,使用前需要引用Excel.dll,此处是直接用ds导出Excel,导出方法类GetExport如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Data;
  4 using System.IO;
  5 using System.Text;
  6 using System.Windows.Forms;
  7 using Excel;
  8 
  9 namespace XX.Common
 10 {
 11     class ExportExcel
 12     {
 13 
 14         public void GetExport(DataSet ds)
 15         {
 16             if (ds == null)
 17             {
 18                 return;
 19             }
 20             string saveFileName = "";
 21             bool fileSaved = false;
 22             SaveFileDialog saveDialog = new SaveFileDialog();
 23             saveDialog.DefaultExt = "xls";
 24             saveDialog.Filter = "Excel文件|*.xls";
 25             saveDialog.FileName = "name";//Excel文件名称
 26             saveDialog.ShowDialog();
 27             saveFileName = saveDialog.FileName;
 28             if (saveFileName.IndexOf(":") < 0)
 29             {
 30                 return;
 31             }
 32             //被点了取消 
 33 
 34             Excel.Application xlApp = new Excel.Application();
 35             if (xlApp == null)
 36             {
 37                 MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
 38                 return;
 39             }
 40             Excel.Workbooks workbooks = xlApp.Workbooks;
 41             Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
 42             Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1           
 43             Excel.Range range;
 44             //string oldCaption = DateTime.Today.ToString("yy-MM-dd");
 45             long totalCount = ds.Tables[0].Rows.Count;
 46             long rowRead = 0;
 47             //float percent = 0;//本次不显示进度,因此注释掉,需要的话可以放开运用
 48             //worksheet.Cells[1, 1] = "评分结果";
 49             //写入字段           
 50             for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
 51             {
 52                 //worksheet.Cells[1, i + 1] = ds.Tables[0].Columns[i].ColumnName;
 53                 //range = (Excel.Range)worksheet.Cells[1, i + 1];
 54                 ///////此处直接将列名写死,因为ds中直接取出的是英文字段名,若取出的是中文列名可直接用上面两行代码写入(根据实际需要灵活运用即可)////////////
 55                 worksheet.Cells[1, 1] = "第一行第一列";
 56                 worksheet.Cells[1, 2] = "第一行第二列"; 69                 //range = (Excel.Range)worksheet.Cells[1, i + 4];//此处是为列名加样式(底色,加粗等),此次不加样式
 70                 //range.Interior.ColorIndex = 15;
 71                 //range.Font.Bold = true;
 72             }
 73             //写入数值              
 74             for (int r = 0; r < ds.Tables[0].Rows.Count; r++)
 75             {
 76                 for (int i = 0; i < ds.Tables[0].Columns.Count - 1; i++)
 77                 {
 78                     worksheet.Cells[r + 2, 1] = r + 1;
 79                     worksheet.Cells[r + 2, i + 2] = ds.Tables[0].Rows[r][i];
 80                 }
 81                 rowRead++;
 82                 //percent = ((float)(100 * rowRead)) / totalCount;
 83                 //this.lbl_process.Text = "正在导出数据[" + percent.ToString("0.00") + "%]..."; //这里可以自己做一个label用来显示进度.              
 84 
 85                 System.Windows.Forms.Application.DoEvents();
 86             }
 87             //this.lbl_process.Visible = false; //label可见性,此次不用
 88             range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[ds.Tables[0].Rows.Count + 1, ds.Tables[0].Columns.Count + 1]);
 89             range.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, null);
 90 
 91             range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;
 92             range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;
 93 
 94             range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight = Excel.XlBorderWeight.xlThin;
 95 
 96             if (ds.Tables[0].Columns.Count > 1)
 97             {
 98                 range.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;
 99 
100                 range.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;
101                 range.Borders[Excel.XlBordersIndex.xlInsideVertical].Weight = Excel.XlBorderWeight.xlThin;
102             }
103 
104             if (saveFileName != "")
105             {
106                 try
107                 {
108 
109                     workbook.Saved = true;
110                     workbook.SaveCopyAs(saveFileName);
111 
112                     fileSaved = true;
113                 }
114                 catch (Exception ex)
115                 {
116 
117                     fileSaved = false;
118                     MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
119                 }
120             }
121             else
122             {
123                 fileSaved = false;
124 
125             }
126             xlApp.Quit();
127             GC.Collect();//强行销毁           
128             if (fileSaved && File.Exists(saveFileName))
129             {
130                 //System.Diagnostics.Process.Start(saveFileName);
131                 MessageBox.Show("导出成功!", "通知");
132             }
133 
134         }
135     }
136 }

二、Web形式导出Excel

  Web版本导出,此处我使用了NPOI组件,首先需要到官网下载最新组件(http://npoi.codeplex.com/)。需要注意的是,NPOI组件也可以实现winform项目的Excel导出。具体实现导出功能的类如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Data;
 6 using System.IO;
 7 using NPOI;
 8 using NPOI.HPSF;
 9 using NPOI.HSSF;
10 using NPOI.HSSF.UserModel;
11 using NPOI.POIFS;
12 using NPOI.Util;
13 using System.Text;
14 
15 namespace XX.Common
16 {
17     public class ExcelHelper
18     {
19         /// <summary>
20         /// 由DataSet导出数据流Stream
21         /// </summary>
22         /// <param name="sourceDs">要导出数据的DataSet</param>
23         /// <param name="sheetName">页签名称</param>
24         /// <returns>数据流Stream</returns>
25         private static Stream ExportDataSetToExcel(DataSet sourceDs, string sheetName)
26         {
27             HSSFWorkbook workbook = new HSSFWorkbook();
28             MemoryStream ms = new MemoryStream();
29             string[] sheetNames = sheetName.Split(\',\');
30             for (int i = 0; i < sheetNames.Length; i++)
31             {
32                 HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet(sheetNames[i]);
33                 HSSFRow headerRow = (HSSFRow)sheet.CreateRow(0);
34                 // handling header.
35                 foreach (DataColumn column in sourceDs.Tables[i].Columns)
36                     headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
37                 // handling value.
38                 int rowIndex = 1;
39                 foreach (DataRow row in sourceDs.Tables[i].Rows)
40                 {
41                     HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
42                     foreach (DataColumn column in sourceDs.Tables[i].Columns)
43                     {
44                         dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
45                     }
46                     rowIndex++;
47                 }
48             }
49             workbook.Write(ms);
50             ms.Flush();
51             ms.Position = 0;
52             workbook = null;
53             return ms;
54         }
55 
56         /// <summary>
57         /// 由DataSet导出Excel
58         /// </summary>
59         /// <param name="sourceDs">要导出数据的DataSet</param>
60         /// <param name="fileName">指定Excel工作表名称</param>
61         /// <param name="sheetName">指定Excel页签名称</param>
62         public static void ExportDataSetToExcel(DataSet sourceDs, string fileName, string sheetName)
63         {
64             MemoryStream ms = ExportDataSetToExcel(sourceDs, sheetName) as MemoryStream;
65             string UserAgent = HttpContext.Current.Request.ServerVariables["http_user_agent"].ToLower();
66             // Firfox和IE下输出中文名显示正常 
67             if (UserAgent.IndexOf("firefox") == -1)
68             {
69                 fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);
70             } 
71             HttpContext.Current.Response.ContentType = "application/vnd.ms-excel;charset=UTF-8";
72             HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
73             HttpContext.Current.Response.BinaryWrite(ms.ToArray());
74             HttpContext.Current.Response.End();
75             ms.Close();
76             ms = null;
77         }      
78     }
79 }