主要分为两部份
1.Excel操作类
1 引入
2 using System.Data.OleDb;
3 using System.IO;
4 using System.Collections;
5
6 /// <summary>
7 /// Excel导入导出
8 /// </summary>
9 public class ExcelToData
10 {
11 /// <summary>
12 /// 无参构造函数
13 /// </summary>
14 public ExcelToData()
15 {
16 //
17 }
18 /// <summary>
19 /// 带参构造函数,初始化连接Excel字符串
20 /// </summary>
21 /// <param name="fileName">文件绝对路径</param>
22 public ExcelToData(string fileName)
23 {
24 this.connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
25 "Data Source=" + fileName + ";" +
26 "Extended Properties='Excel 8.0;HDR=No;IMEX=1'";//HDR第一行是否为列名;IMEX=1互混数据列作为文本数据读取。
27 }
28
29 private string connStr;
30 /// <summary>
31 /// 连接Excel字符串
32 /// </summary>
33 public string ConnStr
34 {
35 get { return this.connStr; }
36 set { this.connStr = value; }
37 }
38 private List<string> sheets;
39 /// <summary>
40 /// 得到Excel文件所有Sheets(工作表),使用前请先调用FillSheets()方法
41 /// </summary>
42 public List<string> Sheets
43 {
44 //set {this.sheets =value ;}
45 get { return this.sheets; }
46 }
47
48 /// <summary>
49 /// 得到Excel文件所有Sheets(工作表)
50 /// </summary>
51 /// <returns>void</returns>
52 public List<string> FillSheets()
53 {
54 sheets = new List<string>();
55 OleDbConnection conn = new OleDbConnection(connStr);
56 conn.Open();
57 DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
58 conn.Close();
59 if (schemaTable.Rows.Count > 0)
60 {
61 foreach (DataRow dr in schemaTable.Rows)
62 {
63 if (dr[2].ToString().Substring(0, 1) == "'")
64 {
65 sheets.Add(dr[2].ToString().Substring(1, dr[2].ToString().Length - 2));
66 }
67 else
68 {
69 sheets.Add(dr[2].ToString());
70 }
71 }
72 }
73 return sheets;
74
75 }
76 /// <summary>
77 /// 根据指定Excel工作表名的指定单元区域读取数据
78 /// </summary>
79 /// <param name="sheetName">工作表名</param>
80 /// <param name="region">单元区域</param>
81 /// <returns>DataTable</returns>
82 public DataTable GetExcelData(string sheetName, string region)
83 {
84 string sqlStr = "select * from [" + sheetName + region + "]";
85 OleDbDataAdapter ExcelDA = new OleDbDataAdapter(sqlStr, connStr);
86 DataSet ds = new DataSet();
87 try
88 {
89 ExcelDA.Fill(ds);
90 }
91 catch (OleDbException ex)
92 {
93 throw ex;
94 }
95 return ds.Tables[0];
96 }
97 /// <summary>
98 /// 根据指定Excel工作表名读取数据
99 /// </summary>
100 /// <param name="sheetName">工作表名</param>
101 /// <returns></returns>
102 public DataTable GetExcelData(string sheetName)
103 {
104 string sqlStr = "select * from [" + sheetName + "]";
105 OleDbDataAdapter ExcelDA = new OleDbDataAdapter(sqlStr, connStr);
106 DataSet ds = new DataSet();
107 try
108 {
109 ExcelDA.Fill(ds);
110 }
111 catch (OleDbException ex)
112 {
113 throw ex;
114 }
115 return ds.Tables[0];
116 }
117 /// <summary>
118 /// 读取Excel文件所有的sheet工作表中数据到DataSet
119 /// </summary>
120 /// <returns></returns>
121 public DataSet GetAllExcelData()
122 {
123 if (sheets == null)
124 {
125 FillSheets();
126 }
127 string sql = "";
128 DataSet ds = new DataSet();
129 for (int i = 0; i < sheets.Count; i++)
130 {
131 sql = "select * from [" + sheets[i].ToString() + "]";
132 OleDbDataAdapter ExcelDA = new OleDbDataAdapter(sql, connStr);
133 ExcelDA.Fill(ds, sheets[i].ToString());
134 }
135 return ds;
136
137 }
138
139 /// <summary>
140 /// 往Excel文件中批插入数据行,插入时确保该Excel文件存在,且工作表(sheetName)存在。
141 /// </summary>
142 /// <param name="Htable">键表示插入的列,注意必须用(F1,F2,..);值表示插入列值,注意与参数dt中的列要一一对应</param>
143 /// <param name="dt">要向Excel中插入的datatable</param>
144 /// <param name="sheetName">工作表名</param>
145 /// /// <param name="Flag">true,参数Htable键值为参数dt列的索引号;false,为dt列名</param>
146 /// <param name="BeginRow">Excel插入开始行,如(A1:C1);无表示从工作表(sheetName)末尾行开始插入</param>
147 /// <returns>void</returns>
148 public void InsertExcelData(Hashtable Htable, DataTable dt, string sheetName, bool Flag, params string[] BeginRow)
149 {
150 if (Htable.Count > 0)
151 {
152 if (dt.Rows.Count > 0)
153 {
154 string connStr1 = this.connStr.Replace(";IMEX=1", "");
155 OleDbConnection conn = new OleDbConnection(connStr1);
156 conn.Open();
157 OleDbCommand comm = conn.CreateCommand();
158 StringBuilder sb1 = new StringBuilder(256);
159 StringBuilder sb2 = null;
160 foreach (DictionaryEntry de in Htable)
161 {
162 sb1.Append(de.Key.ToString() + ",");
163
164 }
165 sb1.Remove(sb1.Length - 1, 1);
166
167 int colStartID = 0;
168
169 string[] splitStr = null;
170 if (BeginRow.Length > 0)
171 {
172 splitStr = BeginRow[0].ToString().Split(':');
173 if (Char.IsNumber(splitStr[1].ToString(), 1))
174 {
175 colStartID = int.Parse(splitStr[1].ToString().Substring(1));
176 }
177 else
178 {
179 colStartID = int.Parse(splitStr[1].ToString().Substring(2));
180 splitStr[1] = splitStr[1].Substring(0, 2);
181 }
182
183 }
184
185 for (int i = 0; i < dt.Rows.Count; i++)
186 {
187 sb2 = new StringBuilder(256);
188 foreach (DictionaryEntry de in Htable)
189 {
190 if (Flag)
191 {
192 sb2.Append("'" + dt.Rows[i][int.Parse(de.Value.ToString())].ToString() + "',");
193 }
194 else
195 {
196 sb2.Append("'" + dt.Rows[i][de.Value.ToString()].ToString() + "',");
197 }
198
199 }
200 if (BeginRow.Length > 0)
201 {
202
203
204 comm.CommandText = "insert into [" + sheetName + splitStr[0].Substring(0, 1) + colStartID.ToString() + ":" + splitStr[1].Substring(0, 1) + colStartID.ToString() + "] (" + sb1.ToString() + ") values(" + sb2.Remove(sb2.Length - 1, 1).ToString() + ")";
205
206 colStartID++;
207
208 }
209 else
210 {
211 comm.CommandText = "insert into [" + sheetName + "] (" + sb1.ToString() + ") values(" + sb2.Remove(sb2.Length - 1, 1).ToString() + ")";
212 }
213 comm.ExecuteNonQuery();
214 }
215 conn.Close();
216
217 }
218 }
219
220 }
221 /// <summary>
222 /// 插入一条数据
223 /// </summary>
224 /// <param name="Htable">键表示插入的列,注意必须用(F1,F2,..);值表示插入列值</param>
225 /// <param name="sheetName">工作表名</param>
226 /// <param name="BeginRow">Excel插入开始行,如(A1,C1);无表示从工作表(sheetName)末尾行开始插入</param>
227 public void InsertExcelData(Hashtable Htable, string sheetName, params string[] BeginRow)
228 {
229
230 if (Htable.Count > 0)
231 {
232 string connStr1 = this.connStr.Replace(";IMEX=1", "");
233 OleDbConnection conn = new OleDbConnection(connStr1);
234
235 StringBuilder sb1 = new StringBuilder(256);
236 StringBuilder sb2 = new StringBuilder(256);
237 foreach (DictionaryEntry de in Htable)
238 {
239 sb1.Append(de.Key.ToString() + ",");
240 sb2.Append("'" + de.Value.ToString() + "',");
241
242 }
243
244 conn.Open();
245 OleDbCommand comm = conn.CreateCommand();
246 if (BeginRow.Length > 0)
247 {
248 comm.CommandText = "insert into [" + sheetName + BeginRow[0].ToString() + "] (" + sb1.Remove(sb1.Length - 1, 1).ToString() + ") values(" + sb2.Remove(sb2.Length - 1, 1).ToString() + ")";
249
250 }
251 else
252 {
253 comm.CommandText = "insert into [" + sheetName + "] (" + sb1.Remove(sb1.Length - 1, 1).ToString() + ") values(" + sb2.Remove(sb2.Length - 1, 1).ToString() + ")";
254 }
255 comm.ExecuteNonQuery();
256 conn.Close();
257 }
258 }
259
260 /// <summary>
261 /// 更新一行数据
262 /// </summary>
263 /// <param name="sheetName">工作表名</param>
264 /// <param name="Htable">要更新的字段,键表示列名,键值表示要更新列值</param>
265 /// <param name="whereStr">更新条件如(F1=?);无,null</param>
266 /// <param name="updateRow">sheetName中要更新的行如(A1:C1)</param>
267 public void UpdateExcelData(string sheetName, Hashtable Htable, string whereStr, params string[] updateRow)
268 {
269 if (Htable.Count > 0)
270 {
271 string connStr1 = this.connStr.Replace(";IMEX=1", "");
272 OleDbConnection conn = new OleDbConnection(connStr1);
273 conn.Open();
274 OleDbCommand comm = conn.CreateCommand();
275
276 StringBuilder sb1 = new StringBuilder(256);
277 sb1.Append("set ");
278 foreach (DictionaryEntry de in Htable)
279 {
280 sb1.Append(de.Key.ToString() + "='" + de.Value.ToString() + "',");
281
282 }
283
284 if (whereStr != null)
285 {
286 if (updateRow.Length > 0)
287 {
288 comm.CommandText = "UPDATE [" + sheetName + updateRow[0].ToString() + "] " + sb1.Remove(sb1.Length - 1, 1).ToString() + " where " + whereStr;
289 }
290 else
291 {
292 comm.CommandText = "UPDATE [" + sheetName + "] " + sb1.Remove(sb1.Length - 1, 1).ToString() + " where " + whereStr;
293
294 }
295 }
296 else
297 {
298 if (updateRow.Length > 0)
299 {
300 comm.CommandText = "UPDATE [" + sheetName + updateRow[0].ToString() + "] " + sb1.Remove(sb1.Length - 1, 1).ToString();
301 }
302 else
303 {
304 comm.CommandText = "UPDATE [" + sheetName + "] " + sb1.Remove(sb1.Length - 1, 1).ToString();
305
306 }
307 }
308 comm.ExecuteNonQuery();
309 conn.Close();
310
311
312 }
313 }
314
315 }
2.操作页面,添加一个button控件用来确定上传,一个FileUpload控件,一个TextArea控件来显示导入产生的信息
后台代码:
1 protected void btnSubmit_Click(object sender, EventArgs e)
2 {
3 if (!fileExcel.HasFile)
4 {
5 ExtAspNet.Alert.ShowInTop("请您选择Excel文件!");
6 return;//当无文件时,返回
7 }
8 string fileName = fileExcel.FileName;
9 string IsXls = System.IO.Path.GetExtension(fileName).ToString().ToLower();//获得文件的扩展名
10
11 if (IsXls != ".xls" && IsXls != ".xlsx")
12 {
13 ExtAspNet.Alert.ShowInTop("只可以选择Excel文件!");
14 return;//当选择的不是Excel文件时,返回
15 }
16
17 ExcelToData readExcel = new ExcelToData(fileName);
18 readExcel.FillSheets();
19 DataTable dtExcel = readExcel.GetExcelData(readExcel.Sheets[0].ToString());
20 DataRow[] dr = dtExcel.Select(); //定义一个DataRow数组
21 int rowsnum = dtExcel.Rows.Count;
22
23 if (rowsnum < 2)
24 {//第一行为标题,所以从2开始
25 ExtAspNet.Alert.ShowInTop("Excel表为空表,无数据!");
26 return;
27 }
28 else
29 {
30 string User_No = String.Empty;
31 DateTime ScheduleDate;
32 string ShiftName = String.Empty;
33 StringBuilder sb;
34 string strCheckSQL;
35 StringBuilder sbInfo = new StringBuilder();
36 for (int i = 1; i < dr.Length; i++)
37 {
38 sb = new StringBuilder();
39 User_No = dr[i][0].ToString().Trim();
40 ShiftName = dr[i][2].ToString().Trim();
41
42 try
43 {
44 ScheduleDate = DateTime.Parse(dr[i][1].ToString().Trim ());
45
46 }
47 catch (Exception ex)
48 {
49 sbInfo.AppendLine("人员【" + User_No + "】日期【" + dr[i][1].ToString() + "】格式不正确!");
50 continue;
51 }
52
53 try
54 {
55
56 sb.Append("INSERT INTO [dbo].[KQ_Schedule]([EmpID],[ScheduleDate],[ShiftID])");
57 sb.Append(String.Format(" VALUES ('{0}','{1}','{2}') END;", User_No ,ScheduleDate, ShiftName));
58 int result=dbacess.ExecuteNonQuery(sql, null);
59 if (result > 0)
60 {
61 sbInfo.AppendLine("人员【" + User_No + "】导入成功!");
62 }
63 else {
64 sbInfo.AppendLine("人员【" + User_No + "】导入失败!");
65 }
66 }
67 catch (Exception ex) //捕捉异常
68 {
69 sbInfo.AppendLine("人员【" + User_No + "】导入出错:" + ex.Message);
70 continue;
71 }
72
73 }//for i
74 txtInfo.Text = sbInfo.ToString();
75 }
76
77 }