利用C#语言操作Excel文挡,就象Sql语句查询sqldatabase 一样,当我打开一个Excel文挡时,调用C#程式,去便利所有工作簿的单元格,提取出已我需要的那部分数据资料,但是每个Excel文挡的那部分数据的行,列不固定,而且有些数据是和别的数据混在一起。C#程式是否能实现如此功能?
因为要加急处理一批Excel数据,但是文挡数量很大,人工操作起码点几天时间,这个方案的可行性有多高?我个人觉得要实现相当困难,不知哪个高手指点下,万分感谢!!!

解决方案 »

  1.   

    当然这项操作,如果能利用某些中间件肯定能实现的到,问题是我现在要全C#程式操作,有点想法,但是总觉得实现不到,搞过OFFICE开发的高手们,给点意见哦。
    这个程式基本要达成1、OFFICE里的查找功能。(没想法,不能固定X,Y,不清楚该怎么去定位)
                      2、对查找到的数据,按分类进行统计计算,多个字段,非一个字段,而且要分类统计,不仅仅全加在一起,还涉及平均数。(这里就要求按分类找到的是多行多列,类似一张表,然后进行统计计算)
                      3、每个文挡统计结束后按分类在同一指定文挡中,按分类进行数据插入,将统计值存入其中,(可以实现)
    也就是说几百个文挡最终汇总为一个文挡。
    部门    类别    总价值                         
                      
      

  2.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    using System.Data.OleDb;using Excel;//操作EXCEL必须把这个DLL引用近来namespace read_excel
    {
        public partial class Form1 : Form
        {
            private System.Data.DataSet myDataSet;
            public Form1()
            {
                InitializeComponent();
                GetConnetion();
            }
            private void GetConnetion()
            {
                //EXCEL作为数据源的CONNECTION
                string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = C:\\test.xls;Extended Properties=Excel 8.0";
                OleDbConnection myConn = new OleDbConnection(strCon);
                //string strCom = " SELECT * FROM [Sheet1$A1:E4] ";//Command1
                myConn.Open();
                OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
                myDataSet = new DataSet();
                myCommand.Fill(myDataSet, "[Sheet1$]");
                myConn.Close();        }        private void button1_Click(object sender, EventArgs e)
            {
    //这一段不用看,呵呵
                DataGrid1.DataSource = myDataSet;
                DataGrid1.DataMember = "[Sheet1$]";
                dataGrid2.DataSource = myDataSet;
                dataGrid2.DataMember = "[Sheet1$]";
            }        private void button2_Click(object sender, EventArgs e)
            {
                Excel.Application myExcel = new Excel.Application();
                myExcel.Application.Workbooks.Add(true);
                //This part used for only write values which values come from here
                myExcel.Cells[1, 1] = "Li";
                myExcel.Cells[1, 2] = "Xin";
                myExcel.Cells[2, 1] = "Love";
                myExcel.Cells[3, 1] = "Liao";
                myExcel.Cells[3, 2] = "Sheng";
                myExcel.Cells[3, 3] = "Hui";
                
                //This part is used for write values which values come from datagrid
                //for (int i = 1; i < 9; i++)
                //{
                //    for (int j = 1; j < 5; j++)
                //    {
                //        myExcel.Cells[i, j] = Convert.ToInt32(this.DataGrid1[i, j].ToString()) + 1000;
                //    }
                //}把DATAGRID的数据写如
                //myExcel.Save(@"myExcel.xls");
                myExcel.Save(@"C:\FuckYou.xls");
                myExcel.Visible = true;
                //myExcel.Quit();
            }
        }
    }
    至于楼主需求,我想EXCEL一定提供这样的实现:)
      

  3.   

    如果Excel存储的数据不是规范的格式,那么可能没有什么好的办法进行自动化的。
    如果是一行一行的规范的格式存储,那么不妨使用ODBC,这样可以省去你Excel编成的麻烦。
      

  4.   

    为什么一定要人工操作
    Excel的函数功能还是很强大的,也可以写脚本……
      

  5.   

    "些数据是和别的数据混在一起",这个是什么意思?
    如果文档都不规范就别谈什么可行性了,
    一点小建议,你可以把列名读出来(取第一列,判断Value2的值是否是要的字段),
    比如A1的单元格子是其他,B1的单元格是"类别",那就把B这列记下,当取类别时候,
    就取B列,每开个文档都先做取列判定;从你提供的线索就有这些,是否说的更详细些?