想通过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,但数据没有写进去.这如何理解呢? 参与者有分,现行谢过!
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,但数据没有写进去.这如何理解呢? 参与者有分,现行谢过!
所以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 档案可同时支援“读取”与“写入”用途。
不能
所以你的问题估计也是不能
刚用记事本打开StreamWriter写的xls文件,打开后发现,居然没有乱码,而直接手工创建的xls文件,用记事本打开会显示全乱码.这点可能就是楼上说的,写成了另外个文件,而只是把文件名改成了xls.如果换成StringWriter是不是就可以了呢...
另外用Oledb的方式往xls文件插数据,这个方法可以对不同的sheet操作,应该是可行的了(咋就没想到呢~~~).
最后就是Excel对象,虽然可以轻易的控制到xls的每个sheet的每个cell,可惜就是在写大数据量的时候太费时间了.