从Excel数据源文件读取/写入值

时间:2017-05-05 16:32:28

标签: c# excel visual-studio coded-ui-tests

this answer开始,我了解到我们无法更新为正在阅读的CSV数据源文件,但我们是否有可能更新为 Excel 数据源?

[TestMethod]
[DataSource("System.Data.Odbc", "Dsn=Excel Files;Driver={Microsoft Excel Driver (*.xls)};dbq=|DataDirectory|\\data.xlsx;defaultdir=.;driverid=790;maxbuffersize=2048;pagetimeout=5;readonly=false;", "Sheet1$", DataAccessMethod.Random)]
public void ExcelReadWrite()
{
    String a = TestContext.DataRow["Scenario"].ToString();
    String b = "New Order # generated from the app";
    Console.WriteLine(a + ": " + b);
    TestContext.DataRow["Order#"] = b; //Is this possible? if yes, how to write it back?
}

如果这不起作用,我应该采取什么方法? 可能Microsoft.Office.Interop.Excel;DataTable?走这些路径,我们仍然可以使用[DataSource]吗?

更新 写入新文件并不能很好地工作。原因是:

每个数据源行将在一次迭代中处理。数据源文件将始终是相同的原始副本。因此,每次迭代只能更新一行,并且会丢失先前更新的值。

如果每次迭代都覆盖新文件,最终只有一行包含更新的值;如果每次迭代创建不同的文件,最终会有太多新文件,一个文件只包含一行更新值,其余文件都是相同的。例如,如果您的数据源文件包含5000行,您将创建5000个新文件。

1 个答案:

答案 0 :(得分:0)

读取DataSource然后使用更新的数据写回将不起作用,因为每次迭代都使用原始数据源执行测试[TestMethod]。在每次迭代中将覆盖上次迭代的更新数据。最后一次迭代最终只有一行更新数据。

<强>解决方案

data.xlsx:

Scenario    SecondCol   Result
89          23          Value
11          800         Value
888         111         Value
  1. 将数据源中的数据加载到Excel.Workbook对象
  2. 更新Excel.Workbook的数据
  3. 使用更新的Excel.Workbook对象
  4. 覆盖数据源文件

    以下是一个例子。 data.xlsx是Excel数据源文件。

        [TestMethod]
        [DataSource("System.Data.Odbc", "Dsn=Excel Files;Driver={Microsoft Excel Driver (*.xls)};dbq=|DataDirectory|\\data.xlsx;defaultdir=.;driverid=790;maxbuffersize=2048;pagetimeout=5;readonly=false", "Sheet1$", DataAccessMethod.Sequential)] // This is working Excel.xlsx connection!!! Excel (ODBC, Dsn)
    
        public void ExcelReadWrite()
        {
            //Open copied Excel file and create Excel object
            string projectName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
            //string dir = Environment.CurrentDirectory + @"\..\..\..\";
            string dir = System.IO.Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.FullName;
            string targetFilename = "data.xlsx";
            string targetFile = dir + projectName + @"\" + targetFilename;
    
            object missing = Type.Missing;
            object misValue = System.Reflection.Missing.Value;
            Excel.Application excel = new Excel.Application();
            Excel.Workbook wb = excel.Workbooks.Open(targetFile, true, false);
            Excel.Worksheet ws = wb.Sheets[1];
            Excel.Range wr = ws.UsedRange;
            int rowCount = wr.Rows.Count;
            int colCount = wr.Columns.Count;
    
            //make some example data update for current iteration 
            int row = TestContext.DataRow.Table.Rows.IndexOf(TestContext.DataRow); //current iteration data row. zero base
            int generatedData = Convert.ToInt32(TestContext.DataRow[0]) + Convert.ToInt32(TestContext.DataRow[1]); //read from DataSource
            ws.Cells[row + 2, 3] = generatedData; //Worksheet, not zero base, and header row counts
            // ======================================================
            excel.DisplayAlerts = false;
    
            wb.SaveAs(targetFile, Excel.XlFileFormat.xlWorkbookDefault, misValue,
                                                 misValue, misValue, misValue,
                                                 Excel.XlSaveAsAccessMode.xlExclusive, misValue,
                                                 misValue, misValue, misValue, misValue);
            wb.Close(missing, missing, missing);
            excel.Quit();
        }
    

    <强>更新 没有必要制作数据源文件的新副本。如果设置Excel.Workbook.SaveAs,则可以使用readonly=false命令更新数据源文件。请注意[DataSource]部分中的此设置。