2.C#读写Excel-Microsoft.Office.Interop.Excel(前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题,从Nuget下载 Microsoft.Office.Interop.Excel)
3.NPOI方法(推荐、在不安装office的时候也是可以读写的,速度很快):
1 using NPOI.HSSF.UserModel;
2 using NPOI.XSSF.UserModel;
3 using System;
4 using System.Data;
5 using System.IO;
6
7 /// <summary>
8 /// EXCEL操作类
9 /// </summary>
10 public class NPOIHelper
11 {
12 /// <summary>
13 /// 读取指定路径的Excel文件到DataTable
14 /// </summary>
15 /// <param name="filePath"></param>
16 /// <returns></returns>
17 public static DataTable ReadExcel(string filePath)
18 {
19 NPOI.SS.UserModel.ISheet sheet;
20 if (filePath.Contains(".xlsx")) // 2007 xlsx
21 {
22 #region//初始化信息
23 XSSFWorkbook hssfworkbook;
24 try
25 {
26 using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
27 {
28 hssfworkbook = new XSSFWorkbook(file);
29 }
30 }
31 catch (Exception e)
32 {
33 throw e;
34 }
35 sheet = hssfworkbook.GetSheetAt(0);
36 #endregion
37 System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
38 DataTable dt = new DataTable();
39 for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++) // cell数
40 {
41 dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
42 }
43 while (rows.MoveNext())
44 {
45 XSSFRow row = (XSSFRow)rows.Current;
46 DataRow dr = dt.NewRow();
47 for (int i = 0; i < row.LastCellNum; i++)
48 {
49 NPOI.SS.UserModel.ICell cell = row.GetCell(i);
50 if (cell == null)
51 {
52 dr[i] = null;
53 }
54 else
55 {
56 dr[i] = cell.ToString();
57 }
58 }
59 dt.Rows.Add(dr);
60 }
61 return dt;
62 }
63 else // 2003 xls
64 {
65 HSSFWorkbook hssfworkbook;
66 try
67 {
68 using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
69 {
70 hssfworkbook = new HSSFWorkbook(file);
71 }
72 }
73 catch (Exception e)
74 {
75 throw e;
76 }
77 sheet = hssfworkbook.GetSheetAt(0);
78 System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
79 DataTable dt = new DataTable();
80 for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++)
81 {
82 dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
83 }
84 while (rows.MoveNext())
85 {
86 HSSFRow row = (HSSFRow)rows.Current;
87 DataRow dr = dt.NewRow();
88 for (int i = 0; i < row.LastCellNum; i++)
89 {
90 NPOI.SS.UserModel.ICell cell = row.GetCell(i);
91 if (cell == null)
92 {
93 dr[i] = null;
94 }
95 else
96 {
97 dr[i] = cell.ToString();
98 }
99 }
100 dt.Rows.Add(dr);
101 }
102 return dt;
103 }
104 }
105
106 /// <summary>
107 /// 将DataTable数据写入到指定路径的Excel文件
108 /// </summary>
109 /// <param name="dt"></param>
110 /// <param name="filePath"></param>
111 public static void WriteExcel(DataTable dt, string filePath)
112 {
113 if (!string.IsNullOrEmpty(filePath) && null != dt && dt.Rows.Count > 0)
114 {
115 if (filePath.Contains(".xlsx")) // 2007 xlsx
116 {
117 XSSFWorkbook book = new XSSFWorkbook();
118 NPOI.SS.UserModel.ISheet sheet = book.CreateSheet(dt.TableName);
119
120 NPOI.SS.UserModel.IRow row = sheet.CreateRow(0);
121 for (int i = 0; i < dt.Columns.Count; i++)
122 {
123 row.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
124 }
125 for (int i = 0; i < dt.Rows.Count; i++)
126 {
127 NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(i + 1);
128 for (int j = 0; j < dt.Columns.Count; j++)
129 {
130 row2.CreateCell(j).SetCellValue(Convert.ToString(dt.Rows[i][j]));
131 }
132 }
133 // 写入到客户端
134 using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
135 {
136 book.Write(ms);
137 using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
138 {
139 byte[] data = ms.ToArray();
140 fs.Write(data, 0, data.Length);
141 fs.Flush();
142 }
143 book = null;
144 }
145 }
146 else // 2003 xls
147 {
148 NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
149 NPOI.SS.UserModel.ISheet sheet = book.CreateSheet(dt.TableName);
150
151 NPOI.SS.UserModel.IRow row = sheet.CreateRow(0);
152 for (int i = 0; i < dt.Columns.Count; i++)
153 {
154 row.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
155 }
156 for (int i = 0; i < dt.Rows.Count; i++)
157 {
158 NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(i + 1);
159 for (int j = 0; j < dt.Columns.Count; j++)
160 {
161 row2.CreateCell(j).SetCellValue(Convert.ToString(dt.Rows[i][j]));
162 }
163 }
164 // 写入到客户端
165 using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
166 {
167 book.Write(ms);
168 using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
169 {
170 byte[] data = ms.ToArray();
171 fs.Write(data, 0, data.Length);
172 fs.Flush();
173 }
174 book = null;
175 }
176 }
177 }
178 }
179 }
附加:C# DataTable转化为自定义DataTable