问题的提出 |
最近朋友提出有很多调查报表需要进行统计,让我帮帮忙,从原来的电子表格统计数据中提取所需要的格式。拿到打开原始的电子表格统计表,字段有100多个,显得杂乱无章。 原始数据部分字段截图如下:
需要提取出所需要的字段信息如下:
Excel的读取 |
使用WINFORM来进行解决统计:
1、读取Excel,并返回DataSet
public static DataSet LoadDataFromExcel(string filePath, string Sheet) { try { string strConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0} ;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\"", filePath); ; OleDbConnection OleConn = new OleDbConnection(strConn); OleConn.Open(); string sql = string.Format("SELECT * FROM [{0}]", Sheet);//可是更改Sheet名称,比如sheet2,等等 OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn); DataSet OleDsExcle = new DataSet(); OleDaExcel.Fill(OleDsExcle, "Sheet1"); OleConn.Close(); return OleDsExcle; } catch (Exception err) { MessageBox.Show("数据绑定Excel失败!失败原因:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; } }
2、绑定数据到GridView显示,读取具体字段部分就没有贴出代码了。只要熟悉数据库操作的都知道如何取值了。
DataTable dt = new DataTable(); dt.Columns.Add("serial"); dt.Columns.Add("qs2"); dt.Columns.Add("qdsex"); dt.Columns.Add("F_H_N_Age"); dt.Columns.Add("qd03a"); dt.Columns.Add("qd10e"); dt.Columns.Add("F_Count"); dt.Columns.Add("F_Y_Count"); dt.Columns.Add("qd36a"); dt.Columns.Add("qd37a"); dt.Columns.Add("qd37c"); dt.Columns.Add("qd37d"); dr["serial"] = serial; dr["qs2"] = qs2; dr["qdsex"] = qdsex; dr["F_H_N_Age"] = F_H_N_Age; dr["qd03a"] = qd03a; dr["qd10e"] = qd10e; dr["F_Count"] = F_Count + 1; dr["F_Y_Count"] = F_Y_Count; dr["qd36a"] = qd36a; dr["qd37a"] = qd37a; dr["qd37c"] = qd37c; dr["qd37d"] = qd37d; dt.Rows.Add(dr); this.dataGridView1.AutoGenerateColumns = false; this.dataGridView1.Columns[0].DataPropertyName = "serial"; this.dataGridView1.Columns[1].DataPropertyName = "qs2"; this.dataGridView1.Columns[2].DataPropertyName = "qdsex"; this.dataGridView1.Columns[3].DataPropertyName = "F_H_N_Age"; this.dataGridView1.Columns[4].DataPropertyName = "qd03a"; this.dataGridView1.Columns[5].DataPropertyName = "qd10e"; this.dataGridView1.Columns[6].DataPropertyName = "F_Count"; this.dataGridView1.Columns[7].DataPropertyName = "F_Y_Count"; this.dataGridView1.Columns[8].DataPropertyName = "qd36a"; this.dataGridView1.Columns[9].DataPropertyName = "qd37a"; this.dataGridView1.Columns[10].DataPropertyName = "qd37c"; this.dataGridView1.Columns[11].DataPropertyName = "qd37d"; this.dataGridView1.DataSource = dt;
运行结果:
3、导出结果集保存Excel文件
SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Execl files (*.xls)|*.xls"; saveFileDialog.FilterIndex = 0; saveFileDialog.RestoreDirectory = true; saveFileDialog.CreatePrompt = true; saveFileDialog.Title = "导出Excel文件到"; DateTime now = DateTime.Now; saveFileDialog.FileName = now.Year.ToString().PadLeft(2) + now.Month.ToString().PadLeft(2, '0') + now.Day.ToString().PadLeft(2, '0') + "-" + now.Hour.ToString().PadLeft(2, '0') + now.Minute.ToString().PadLeft(2, '0') + now.Second.ToString().PadLeft(2, '0'); saveFileDialog.ShowDialog(); Stream myStream; myStream = saveFileDialog.OpenFile(); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312")); 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) { MessageBox.Show(ex.ToString()); } finally { sw.Close(); myStream.Close(); }
4、导出保存的电子表格文件:
总结 |
1、在读取Excel表单的时候,如果字段里面有数字和文字混搭,必须将整列的字段全部设置成文本格式,不然无法读取,遇到文字的取值返回为空。
2、在读取有科学计数法的字段也必须设置成文本。