c#中如何将wps中的excel表格数据读取出来存入dataset中,程序读取office excel表格数据没有问题,读取WPS的excel表格数据就无法读取到!!新手求各位大神指教!!!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
//using System.Linq;
using System.Text;
//using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Data.OleDb;namespace 简单对号
{
    public partial class checkNum : Form
    {
        string strBox = "";//存储值,显示到richtextbox文本框中
        int i = 0;  //统计扫描多少条数据
        public checkNum()
        {
            InitializeComponent();
        }        static DataSet getExcelDataResult = new DataSet();//设置一个变量存储表格getData()的返回值
       // static DataTable myTable=new DataTable();
        DataView myDataView = new System.Data.DataView();
       
        //获取datatable数据的透视表
        private DataView getDataViewResult(DataTable dt,string strRowFilter)
        {
            DataView myDataView = null;
            try
            {
                //dt = getExcelDataResult.Tables[0];                myDataView = new System.Data.DataView(dt); //dataview数据透视表筛选datatable中的数据,效率提高很多,比用循环遍历快,15000条数据循环遍历3秒,dataview零点几秒
                myDataView.RowFilter = strRowFilter;//dataview中的  RowFilter属性:后跟一个运算符和值要作为筛选依据的列的名称。 值必须在引号中。 例如:"LastName = Smith"
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("错误信息:" + ex.Message, "出现错误");
            }
            return myDataView;
        }        private void imei1KeyPress(object sender, KeyPressEventArgs e)
        {                myDataView = null;                resultBox.Text = "";
                //背景色还原初始状态
                resultBox.BackColor = SystemColors.Control;
                //获得属性中设置的字体,大小,风格
                //判断是否回车按下,e为控件传入的一个对象,里面用户存有按下的键的char值
                //通过Convert.ToChar(System.Windows.Forms.Keys.Enter)我们可以得到Enter键的char值
                //.Enter可替换为其他按键
                //imei1txt.Focus();
                if ((imei1txt.Text.Length != 0) && (e.KeyChar == Convert.ToChar(System.Windows.Forms.Keys.Enter)))
                {
                    try
                    {
                        string strRowFilter = "F1='" + imei1txt.Text + "'"; //dataview数据透视表查询条件
                        myDataView = getDataViewResult(getExcelDataResult.Tables[0], strRowFilter);
                        if (myDataView[0]["F1"].ToString() != "")
                        {
                            dataGridView1.DataSource = myDataView;
                            //entenr键按下,聚焦imei2文本框,同时选中imei2文本框
                            imei2txt.Focus();
                            imei2txt.SelectAll();
                        }                        
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("错误信息:imei:"+imei1txt.Text+"不存在数据源中!!!" , "错误信息");
                        imei1txt.SelectAll();
                    }
                }
        }        private void imei2KeyPress(object sender, KeyPressEventArgs e)
        {
            try
            {
                // 
                if ((imei1txt.Text.Length != 0)&&(imei2txt.Text.Length != 0) && (e.KeyChar == Convert.ToChar(System.Windows.Forms.Keys.Enter)))
                {
                    //获取dataview中的数据
                    //写法一:写法清晰
                    //string dvImei = dv.Table.Rows[0]["imei"].ToString();                    //写法二:写法短,效率会相应提高
                    string dvImei = myDataView[0][0].ToString();
                    string dvSn = myDataView[0][1].ToString();                    //测试使用:判断是否能读取到imei和sn
                    //textBox1.Text = dvImei + "\t" + dvSn;
                    if (dvSn == imei2txt.Text.ToString())
                    {
                        resultBox.Text = "PASS";
                        //设置背景色
                        resultBox.BackColor = System.Drawing.Color.Chartreuse;
                        //获得属性中设置的字体,大小,风格
                        resultBox.Font = new Font(resultBox.Font.Name, resultBox.Font.Size, resultBox.Font.Style);
                        //将值写入本地文本文档
                        string str = imei1txt.Text + "\t" + imei2txt.Text + "\r\n";
                        File.AppendAllText("result.txt", str);
                        strBox += str;
                        showBox.Text = strBox;  //追加文本框内容
                        i++;
                        totalLab.Text = "总计" + i + "行";
                    }
                    else
                    {
                        resultBox.Text = "FAIL";
                        //设置背景色
                        resultBox.BackColor = System.Drawing.Color.Red;
                        //获得属性中设置的字体,大小,风格
                        resultBox.Font = new Font(resultBox.Font.Name, resultBox.Font.Size, resultBox.Font.Style);
                    }
                }
                else
                {
                    //当enter键按下后才显示判断结果
                    if (e.KeyChar == Convert.ToChar(System.Windows.Forms.Keys.Enter))
                    {
                        resultBox.Text = "FAIL";
                        //设置背景色
                        resultBox.BackColor = System.Drawing.Color.Red;
                        //获得属性中设置的字体,大小,风格
                        resultBox.Font = new Font(resultBox.Font.Name, resultBox.Font.Size, resultBox.Font.Style);
                    }
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message, "错误信息");
                resultBox.Text = "FAIL";
                //设置背景色
                resultBox.BackColor = System.Drawing.Color.Red;
                //获得属性中设置的字体,大小,风格
                resultBox.Font = new Font(resultBox.Font.Name, resultBox.Font.Size, resultBox.Font.Style);
            }
           
          
            
            if (e.KeyChar == Convert.ToChar(System.Windows.Forms.Keys.Enter))
            {
                //entenr键按下,聚焦imei1文本框,同时选中imei1文本框
                imei1txt.Text = "";
                imei2txt.Text = "";
                imei1txt.Focus();
                imei1txt.SelectAll();
            }
        }        //窗体加载事件
        private void checkNum_Load(object sender, EventArgs e)
        {
            dataGridView1.ClearSelection();//窗体加载前先清除所有内容
            string filePath = Application.StartupPath + "\\data\\data.xls";//文件路径
           // string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + "Extended Properties=Excel 8.0;";//excel表格连接字符串
            //string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + filePath + ";Extended Properties='Excel 8.0; HDR=NO; IMEX=1'"; //此連接只能操作Excel2007之前(.xls)文件
            string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + filePath + ";Extended Properties='Excel 12.0; HDR=NO; IMEX=1'"; //此連接可以操作.xls與.xlsx文件
            OleDbConnection conn = new OleDbConnection(strConn);
            try
            {
                conn.Open();//打开连接
                //返回Excel的架构,包括各个sheet表的名称,类型,创建时间和修改时间等
                DataTable dtExcName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
                //包含excel中表名的字符串数组
                string[] strTableNames = new string[dtExcName.Rows.Count];
                for (int i = 0; i < dtExcName.Rows.Count; i++)
                {
                    strTableNames[i] = dtExcName.Rows[i]["TABLE_NAME"].ToString();
                }
                string strSql = "select * from [" + strTableNames[0] + "]";//表名的写法也应注意不同,对应的excel表为sheet1,在这里要在其后加美元符号¥,并用中括号
                OleDbCommand cmd = new OleDbCommand(strSql, conn);//建立执行命令
                OleDbDataAdapter oda = new OleDbDataAdapter(cmd);//建立数据适配器
                oda.Fill(getExcelDataResult, "myTable");//把数据适配器中的数据读到数据集汇总的一个表中(此处表名为shyman,可以任取表名)
                //指定datagridview1的数据源为数据集ds的第一张表(也就是shyman表),也可以写ds.Table["shyman"]
                dataGridView1.DataSource = getExcelDataResult.Tables[0];            }
            catch (Exception ex)
            {
                MessageBox.Show("错误信息:未找到数据源或excel表格格式不正确(excel需2003格式)!!!");
            }
            finally
            {
                conn.Close();
            }        
        }       
    }
}

解决方案 »

  1.   

    用 NPOI 不行么?
      

  2.   

    引用wps com库,但是只有企业版支持
      

  3.   

    你好,如果我电脑安装了企业版的WPS,程序放到安装WPS个人版的电脑上能读取到数据么?
      

  4.   

    你好,如果我电脑安装了企业版的WPS,程序放到安装WPS个人版的电脑上能读取到数据么?
      

  5.   

    问题已解决,谢谢各位大神的指点:是读取表格数据的连接字符串出了问题。
    将string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + filePath + ";Extended Properties='Excel 12.0; HDR=NO; IMEX=1'";
    修改为 string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + filePath + ";Extended Properties='Excel 8.0; HDR=NO; IMEX=1'";即可,这样不管是office还是WPS的表格都能够读取到,不过我读取的是2003版本的,没有去读取2007版本