C#加载doc文档中的表格与txt文档中的数据然后进行操作

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Word;
using System.Runtime.InteropServices;


namespace DataOperater
{
    public partial class FormDataoperation : Form
    {
        public FormDataoperation()
        {
            InitializeComponent();
        }
        #region txt文档输入路径
        private void btnInputpath_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog folder = new FolderBrowserDialog();
            if (folder.ShowDialog() == DialogResult.OK)
            {
                txtBoxInputpath.Text = folder.SelectedPath;
            }
        }
        #endregion


        #region 站台数据输入路径与文件名及其拓展名
        private void btnStationPath_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "选择输入路径";
            openFileDialog.InitialDirectory = @"E:\";
            openFileDialog.RestoreDirectory = true;
            //如果选择ok,将路径输出到txtBox中
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                txtBoxStationpath.Text = openFileDialog.FileName;
            }
        }


        #endregion


        #region 输出路径


        private void btnOutputpath_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog folder = new FolderBrowserDialog();
            if (folder.ShowDialog ()==DialogResult.OK)
            {
                txtBoxOutputpath.Text = folder.SelectedPath;
            }
        }
        #endregion


        private void btnBegin_Click(object sender, EventArgs e)
        {
            //对文件夹下的txt文档进行遍历
            string[] txt_files = Directory.GetFiles(txtBoxInputpath.Text, "*.txt");
            foreach (var txt_file in txt_files)
            {
                
                #region 将doc文档加载到datatable中以及他的获得列名


                System.Data.DataTable stationdatatable = readWordFile();
                string[] stationdatatable_columnName = GetColumnName(stationdatatable);
                
                #endregion


                #region  获TXT数据的datatable以及他的列名
                System.Data.DataTable txtdatatable = readData(txt_file, new Char[] { ' ', ',', '.', ':', '\t' });
                txtdatatable.Columns[0].ColumnName = stationdatatable.Columns[0].ColumnName;
                string[] txtdatatable_columnName = GetColumnName(txtdatatable);
                txtdatatable.Columns.Remove(txtdatatable_columnName[txtdatatable_columnName.Length - 1]);
                txtdatatable.Columns.Remove("V04003");
                //string[] XIUtxtdatatable_columnName = GetColumnName(txtdatatable);
                #endregion


                #region 获得合并的表及列名
                System.Data.DataTable hebingdatatable = HebingTwoDataTable(stationdatatable, txtdatatable);
                string[] hebingdatatable_columnName = GetColumnName(hebingdatatable);
                #endregion
                #region 查询数据是否正确
                    System.Data.DataTable pfilterdatatable = removeRow(hebingdatatable, "32766",8);
                    System.Data.DataTable pfilter1datatable = removeRow(pfilterdatatable, "32744", 8);
                    System.Data.DataTable pfilte2rdatatable = removeRow(pfilter1datatable, "32700", 8);
                
                #endregion


                    #region 生成平均值的datatable
                    System.Data.DataTable dtResult = Average(pfilte2rdatatable, txtdatatable, 8);
                    
                    #endregion


                //datatable生成TXT文档
                TOTXT(dtResult);
            }
            
            MessageBox.Show("所有的文档已遍历完成!");
        }
        #region 读取doc文档


        public System.Data.DataTable readWordFile()
        {
            object oFileName = txtBoxStationpath.Text;
            object oMissing = System.Reflection.Missing.Value;
            //object oFileName = FilePath;
            object oReadOnly = true;
            Microsoft.Office.Interop.Word._Application oWord = new Microsoft.Office.Interop.Word.Application();
            Microsoft.Office.Interop.Word._Document oDoc = oWord.Documents.Open(ref oFileName, ref oMissing, ref oReadOnly,
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing);
            Microsoft.Office.Interop.Word.Table oTable = oDoc.Tables[1];
            System.Data.DataTable dt = new System.Data.DataTable();


            bool Flag = true;
            int STaColCount = 0;


            DataColumn Station_file_dBCol;
            for (int ii = 0; ii < oTable.Rows.Count; ii++)
            {
                if (Flag)
                {
                    Flag = false;
                    //获取长度
                    STaColCount = oTable.Columns.Count - 5;
                    for (int i = 0; i < oTable.Columns.Count - 5; i++)
                    {
                        //添加列
                        string text = oTable.Cell(ii + 1, i + 1).Range.Text.ToString();
                        //string text = table.Rows[ii].Cells[jj].ToString();
                        text = text.Substring(0, text.Length - 2);
                        Station_file_dBCol = new DataColumn(text);
                        //列的名称为ColumnName


                        //将添加的列加入到DataTable中
                        dt.Columns.Add(Station_file_dBCol);
                    }
                }
                else
                {
                    DataRow rw = dt.NewRow();
                    for (int jj = 0; jj < oTable.Columns.Count - 5; jj++)
                    {
                        string stationcolname = "";
                        stationcolname = dt.Columns[jj].ColumnName;
                        string text = oTable.Cell(ii + 1, jj + 1).Range.Text.ToString();
                        text = text.Substring(0, text.Length - 2);
                        rw[stationcolname] = text;
                    }
                    dt.Rows.Add(rw);
                }
            }
            oDoc.Close(ref oMissing, ref oMissing, ref oMissing);
            oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
            return dt;
        }


        #endregion


        #region 函数
        //求datatable的多列进行求平均值
        //Average(求平均值的, 想要的表名datatable, 从x+1列开始求平均值(x是索引从0开始))
        public System.Data.DataTable Average(System.Data.DataTable hebingdatatable, System.Data.DataTable txtdatatable, int x)
        {
            string[] hebingdatatable_columnName = GetColumnName(hebingdatatable);
            System.Data.DataTable dtResult = hebingdatatable.Clone();
            dtResult.TableName = txtdatatable.TableName + txtBoxResultname.Text;
            //将dt克隆到dtResult,但是dtResult里面并没有数据,只有结构,这是COPY方法的区别
            //把区站号的所有的类成一列
            System.Data.DataTable dtQuzhanhaoName = hebingdatatable.DefaultView.ToTable(true, hebingdatatable_columnName[0]);
            for (int i = 0; i < dtQuzhanhaoName.Rows.Count; i++)
            {
                //根据月份选择行
                string filter1;
                string filter2;
                filter2 = "区站号='" + dtQuzhanhaoName.Rows[i][0] + "'";
                System.Data.DataTable dtfilterQuzhanhao = SELECTROWSTONEWDatatable(hebingdatatable, filter2);
                string[] dtfilterQuzhanhao_columnName = GetColumnName(dtfilterQuzhanhao);


                System.Data.DataTable dtMouthName = dtfilterQuzhanhao.DefaultView.ToTable(true, "V04002");


                //进行平均值操作
                for (int f = 0; f < dtMouthName.Rows.Count; f++)
                {
                    DataRow dr = dtResult.NewRow();
                    filter1 = "V04002= '" + dtMouthName.Rows[f][0] + " '";
                    DataRow[] rows = dtfilterQuzhanhao.Select(filter1);
                    System.Data.DataTable temp = dtResult.Clone();
                    //将要计算的列改为数字型的以便计算
                    for (int u = x; u < dtfilterQuzhanhao_columnName.Length; u++)
                    {
                        temp.Columns[u].DataType = Type.GetType("System.Double");
                    }
                    //通过改的类型将数据加载到另一个表temp中,然后对这个表进行计算
                    foreach (DataRow row in rows)
                    {
                        temp.Rows.Add(row.ItemArray);
                    }
                    for (int k = 0; k < x-1; k++)
                    {
                        //加载不变列
                        dr[k] = dtfilterQuzhanhao.Rows[f][k].ToString();
                    }
                    //根据月选择行
                    for (int k = x-1; k < x; k++)
                    {
                        //加载不变列
                        dr[k] = dtMouthName.Rows[f][0].ToString();
                    }
                    System.Data.DataTable dtfilterMouthtable = SELECTROWSTONEWDatatable(dtfilterQuzhanhao, filter1);
                    string[] dtfilterMouthtable_columnName = GetColumnName(dtfilterMouthtable);
                    for (int z = x; z < dtfilterMouthtable_columnName.Length; z++)
                    {
                        string avgfilter = "Avg(" + dtfilterMouthtable_columnName[z] + ")";
                        string data = temp.Compute(avgfilter, "true").ToString();
                        dr[z] = data;


                    }
                    dtResult.Rows.Add(dr);
                }


            }
            return dtResult;
        }
        //读入TXT文档到datatable中
        //readData(要读取的路径只是文件夹的路径, 分隔开数据的字符如:( { ' ', ',', '.', ':', '\t' }))
        public System.Data.DataTable readData(string path, char[] splitzifu)
        {
            string fileName = Path.GetFileNameWithoutExtension(path);
            //定义DataTable
            System.Data.DataTable Station_file_datatable = new System.Data.DataTable(fileName);
            //定义列
            DataColumn Station_file_dBCol;
            //定义行
            DataRow Station_file_dBRow;
            string station_line;
            bool Flag = true;
            int STaColCount = 0;


            //读取文件
            System.IO.StreamReader Station_StR = new System.IO.StreamReader(path, Encoding.GetEncoding("gb2312"));
            //只要读取到的内容不是空,就一直读取文件
            while ((station_line = Station_StR.ReadLine()) != null)
            {
                //拆分字符串空格 与逗号,已 , 为间隔
                string[] Stationaryline = station_line.Split(splitzifu);


                if (Flag)
                {
                    Flag = false;
                    //获取长度
                    STaColCount = Stationaryline.Length;


                    for (int i = 0; i < Stationaryline.Length; i++)
                    {
                        //添加列
                        Station_file_dBCol = new DataColumn(Stationaryline[i]);
                        //列的名称为ColumnName


                        //将添加的列加入到DataTable中
                        Station_file_datatable.Columns.Add(Station_file_dBCol);
                    }
                }
                else
                {
                    //新创建行,行的列头、数据类型与DataTable相同
                    Station_file_dBRow = Station_file_datatable.NewRow();
                    for (int i = 0; i < STaColCount; i++)
                    {
                        // 给新行的数据赋值
                        string stationcolname = "";
                        stationcolname = Station_file_datatable.Columns[i].ColumnName;
                        Station_file_dBRow[stationcolname] = Stationaryline[i];
                    }
                    Station_file_datatable.Rows.Add(Station_file_dBRow);
                }
            }


            return Station_file_datatable;
        }




        //获取列名
        public string[] GetColumnName(System.Data.DataTable dt)
        {
            string[] strColumns = null;




            if (dt.Columns.Count > 0)
            {
                int columnNum = 0;
                columnNum = dt.Columns.Count;
                strColumns = new string[columnNum];
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    strColumns[i] = dt.Columns[i].ColumnName;
                }
            }




            return strColumns;
        }


        //合并两个datatable表
        public System.Data.DataTable HebingTwoDataTable(System.Data.DataTable stationdatatable,
            System.Data.DataTable txtdatatable)
        {
            string[] XIUtxtdatatable_columnName = GetColumnName(txtdatatable);
            string[] XIUstationdatatable_columnName = GetColumnName(stationdatatable);
            #region 将两个表进行合并
            //使用datatable.AsDataView()方法创建dataview对象
            DataView stationdataview = stationdatatable.AsDataView();
            DataView txtdataview = txtdatatable.AsDataView();
            //新建一个表储存合并的结果
            System.Data.DataTable hebingdatatable = new System.Data.DataTable("气象数据与站台数据合并表");
            for (int i = 0; i < XIUstationdatatable_columnName.Length; i++)
            {
                hebingdatatable.Columns.Add(XIUstationdatatable_columnName[i]);
            }
            for (int i = 1; i < XIUtxtdatatable_columnName.Length; i++)
            {
                hebingdatatable.Columns.Add(XIUtxtdatatable_columnName[i]);
            }
            
            var query_hebing =
                from txt in txtdatatable.AsEnumerable()
                join station in stationdatatable.AsEnumerable()
                on txt.Field<string>("区站号") equals station.Field<string>("区站号")
                select station.ItemArray.Concat(txt.ItemArray.Skip(1));//
            foreach (var obj in query_hebing)
            {
                DataRow dr = hebingdatatable.NewRow();
                dr.ItemArray = obj.ToArray();
                hebingdatatable.Rows.Add(dr);
            }
            #region 逐个的加载相应的行


            #endregion
            #endregion
            return hebingdatatable;
        }


        //将datatable生成一个TXT文档
        public void TOTXT(System.Data.DataTable datatable)
        {
            System.Text.StringBuilder strBd = new System.Text.StringBuilder();
            if (datatable.Rows.Count > 0)
            {
                for (int i = 0; i < datatable.Rows.Count; i++)
                {
                    for (int j = 0; j < datatable.Columns.Count; j++)
                    {
                        strBd.Append(datatable.Rows[i][j].ToString() + ",");
                    }
                    strBd.Append("\r\n");
                }
            }
            string s = strBd.ToString();
            System.IO.File.WriteAllText(txtBoxOutputpath.Text + "//" + datatable.TableName + ".txt", s, Encoding.Default);
        }


        //将过滤后的行生成新的datatable
        public System.Data.DataTable SELECTROWSTONEWDatatable(System.Data.DataTable datatable, string filter)
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            dt = datatable.Clone();//拷贝框架
            DataRow[] dr = datatable.Select(filter);
            for (int i = 0; i < dr.Length; i++)
            {
                dt.ImportRow((DataRow)dr[i]);
            }
            return dt;
        }
        
        //按列的条件删除某些行
        public System.Data.DataTable removeRow(System.Data.DataTable datatable, string filter,int x)
        {
            string[] datatablename = GetColumnName(datatable);
            for (int i = x; i < datatable.Columns.Count; i++)
            {
                //选出列为某值的行
                string filterr = datatablename[i] + "=";
                string filter1="'"+filter+"'"; 
                DataRow[] foundRow = datatable.Select(filterr + filter1, "");


                foreach (DataRow row in foundRow)
                {
                    datatable.Rows.Remove(row);
                }
            }
            return datatable;
            
        }
        #endregion


    }
}





猜你喜欢

转载自blog.csdn.net/Sun_xiangyan/article/details/78832185