想通过StreamWriter向a.xls文件添加多行数据(之前用Excel对象写数据,但速度太慢.).
Excel限制了每个sheet最多有65536行数据,而我要添加进去的数据远超过这个数,所以想通过在一个xls文件中建立多个sheet来实现.
假如a.xls中有两个sheet(sheet1,sheet2).
问题1:如何选择不同的sheet,以便用StreamWriter能对不同的sheet写数据.
比如,当我StreamWriter sw = new StreamWriter(@"c:\a.xls");
sw.WriteLine("testText1/ttestText2");
时,怎么知道或者选择对哪个sheet(sheet1 or sheet2?)写数据?
问题2:当我StreamWriter sw = new StreamWriter(@"c:\a.xls");
sw.WriteLine("testText1/ttestText2");
sw.Flush();
sw.close();时,打开a.xls一看,发现原本有两个sheet的a.xls文件(手按圣经,确定!),变成只有一个sheet了,而且sheet的名字也变了(重新生成了个a.xls覆盖了之前的a.xls?),但是数据写进去了.
      而用StreamWriter sw = File.AppendText(@"c:\a.xls);
sw.WriterLine("testText1/ttestText2");
sw.Flush();
sw.close();(时,a.xls仍然有两个sheet,但数据没有写进去.这如何理解呢?   参与者有分,现行谢过!

解决方案 »

  1.   

    明显用streamwriter写的时候把之前存在于excel文档中的数据都抹掉了
    所以sheet的区分就没有了
    用File.AppendText写的时候,是在excel文档中仅存的两个sheet之外的地方写入数据了,所以没有显示操作excel页可以用oledb
    方法:
    OleDbConnection objConn = null;
    DataSet data = new DataSet();
    try
    {
    string strConn = @"Provider=Microsoft.ACE.OleDb.12.0;Data Source=c:"待发工资.xlsx;Extended Properties='Excel 12.0;HDR=YES'";//IMEX=1为只读
    //"Provider=Microsoft.Jet.OleDb.4.0;data source=c:"待发工资.xlsx;Extended Properties=""Excel 12.0;HDR=YES;IMEX=1""";
                    objConn = new OleDbConnection(strConn);
    objConn.Open();
    //System .Data . DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
    //int SheetIndex = 0;
    //string tableName = schemaTable.Rows[SheetIndex][2].ToString().Trim();string strSql = "Select   *   From   [Sheet1$]";
    OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
    OleDbDataAdapter sqlada = new OleDbDataAdapter();
    sqlada.SelectCommand = objCmd;
    sqlada.Fill(data);
    string str = "";
    for (int i = 0; i < data.Tables[0].Rows[0].ItemArray.Length; i++)
    {
    str += data.Tables[0].Rows[0].ItemArray[i].ToString() + ".";
    }
    MessageBox.Show(str);
    objConn.Close();
    }
    catch (Exception ex)
    {
    objConn.Close();
    Console.WriteLine(ex.Message.ToString());
    }说明
    A: HDR ( HeaDer Row )设置 
        若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称     若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称     B:IMEX ( IMport EXport mode )设置     IMEX 有三种模式,各自引起的读写行为也不同,容後再述: 
        0 is Export mode 
        1 is Import mode 
        2 is Linked mode (full update capabilities) 
              我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:       当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。       当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。       当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
      

  2.   

    StreamWriter来用写文件的方式生成excel其实就是在写csv文件,而只是把文件名存成了xls罢了一个csv文件能有多个sheet吗?
    不能
    所以你的问题估计也是不能
      

  3.   

    谢谢楼上两位指点迷津,问题已基本解决.
    刚用记事本打开StreamWriter写的xls文件,打开后发现,居然没有乱码,而直接手工创建的xls文件,用记事本打开会显示全乱码.这点可能就是楼上说的,写成了另外个文件,而只是把文件名改成了xls.如果换成StringWriter是不是就可以了呢...
    另外用Oledb的方式往xls文件插数据,这个方法可以对不同的sheet操作,应该是可行的了(咋就没想到呢~~~).
    最后就是Excel对象,虽然可以轻易的控制到xls的每个sheet的每个cell,可惜就是在写大数据量的时候太费时间了.