我有excel文件并加载到c#
windows applciaction中。
我想更改excel单元格中的值,例如更改单元格a10中的值并保存文件。
excel文件包含多个工作表。
在这方面有任何帮助吗?
var ds = new DataSet();
ds = Parse(fileName);
static DataSet Parse(string fileName)
{
string connectionString = string.Format("provider=Microsoft.Jet.OLEDB.4.0; data source={0};Extended Properties=Excel 8.0;", fileName);
DataSet data = new DataSet();
foreach (var sheetName in GetExcelSheetNames(connectionString))
{
using (OleDbConnection con = new OleDbConnection(connectionString))
{
var dataTable = new DataTable();
string query = string.Format("SELECT * FROM [{0}]", sheetName);
con.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);
adapter.Fill(dataTable);
data.Tables.Add(dataTable);
}
}
return data;
}
static string[] GetExcelSheetNames(string connectionString)
{
OleDbConnection con = null;
DataTable dt = null;
con = new OleDbConnection(connectionString);
con.Open();
dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (dt == null)
{
return null;
}
String[] excelSheetNames = new String[dt.Rows.Count];
int i = 0;
foreach (DataRow row in dt.Rows)
{
excelSheetNames[i] = row["TABLE_NAME"].ToString();
i++;
}
return excelSheetNames;
}
}
答案 0 :(得分:0)
要指定工作表是否具有标题行,请修改连接字符串以指定HDR
值。有关详细信息,请参阅http://www.connectionstrings.com/excel/。
如果您的工作表有标题行,您可以通过标题引用列。
如果您的工作表没有标题行,请使用F1,F2,F3 .... Fn,其中F1是第一个选定的列。如果你没有指定从哪里开始,那么A,B,C列对应F1,F2,F3等。
e.g。
SELECT * FROM [Sheet1$] <-- Column A=F1, B=F2 etc.
SELECT * FROM [Sheet1$B1:Z100] <-- Column B=F1, C=F2 etc.
现在,一旦你知道如何引用列,休息应该很容易。创建一个OledbCommand对象并执行命令。
UPDATE [Sheet1$A1:A1] SET F1='TestValue1' <-- trick to update only one cell
UPDATE [Sheet1$] SET F1='TestValue1', F2 = 'some value 2' WHERE WhateverCondition
我从未尝试过使用excel oledb的数据集和DataAdapter,但从逻辑上讲它应该也可以工作,因为最终它们都会深入到Command
对象。