在c#中更改excel文件的单元格值?

时间:2013-11-27 11:42:19

标签: c# excel

我有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;
        }
    }

1 个答案:

答案 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对象。