Winform读取Excel进行数据统计并且导出统计结果

时间:2022-09-11 23:24:45
问题的提出

    最近朋友提出有很多调查报表需要进行统计,让我帮帮忙,从原来的电子表格统计数据中提取所需要的格式。拿到打开原始的电子表格统计表,字段有100多个,显得杂乱无章。 原始数据部分字段截图如下:Winform读取Excel进行数据统计并且导出统计结果

   需要提取出所需要的字段信息如下:

   Winform读取Excel进行数据统计并且导出统计结果

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;

运行结果:

Winform读取Excel进行数据统计并且导出统计结果

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、导出保存的电子表格文件:

Winform读取Excel进行数据统计并且导出统计结果

总结

 

 

1、在读取Excel表单的时候,如果字段里面有数字和文字混搭,必须将整列的字段全部设置成文本格式,不然无法读取,遇到文字的取值返回为空。

2、在读取有科学计数法的字段也必须设置成文本。