在追加三列后将数据写入错误的位置

时间:2015-11-13 04:55:04

标签: c# excel vba excel-interop

我将数据从一个位置复制到另一个位置,并且能够读取和打印所有值,并能够在Excel文件中附加三列。所以现在A,B,C列变成D,E,F(移位)等。

            Excel.Application app = new Excel.Application();
            Excel.Workbooks workbooks = app.Workbooks;
            string newlocation_filename = @"C:\Windows\Temp\" + FileName;
            File.Copy(FilePath, newlocation_filename, true);
            //string filename = FilePath;
            workbooks.Open(newlocation_filename);
            Excel.Workbook workbook = workbooks.Item[1];
            Excel.Sheets worksheets = workbook.Worksheets;
            Excel.Worksheet worksheet = (Worksheet)worksheets.Item[1];
            Excel.Range cells = worksheet.UsedRange;
            Range oRng = worksheet.Range["A1"];
           oRng.EntireColumn.Insert(XlInsertShiftDirection.xlShiftToRight,XlInsertFormatOrigin.xlFormatFromRightOrBelow);

            oRng = worksheet.Range["B1"];
             oRng.EntireColumn.Insert(XlInsertShiftDirection.xlShiftToRight,XlInsertFormatOrigin.xlFormatFromRightOrBelow);

            oRng = worksheet.Range["C1"];
            oRng.EntireColumn.Insert(XlInsertShiftDirection.xlShiftToRight,XlInsertFormatOrigin.xlFormatFromRightOrBelow);

            cells[1, 1] = "AccountNumber";//Set value for row 1 and column 2 (A1)
            cells[1, 2] = "CustomerName";
            cells[1, 3] = "ComparisionResult";//Set value for row 1 and column 3 (B1)

            workbook.Save();//Save Excel-File
            app.Quit();

        }

从上面的代码AccountNumberCustomerNameComparisionResult需要分别在A1,B1,C1单元格(追加的新列)中进行设置。但  它替换D1,E1,F1中的数据(旧的A1,B1,C1表示附加前的含义)字段值,A1,B1,C1字段值不更新。我认为它取代了数据然后附加正在发生。

需要任何Update语句才能解决此问题吗?

2 个答案:

答案 0 :(得分:2)

蒂姆得到的几乎是正确的,但严格地说,问题与错误使用UsedRange并不完全相关,而是与稍后发生的插入有关,这会影响已经分配的范围变量。你首先指定:

Excel.Range cells = worksheet.UsedRange;

此时,cells[1, 1]A1,因为后者实际上是第一个使用过的单元格。但是当您稍后在开始时进行三次列插入时,您设置的任何范围将向右移动3个位置。因此,在三次插入后,cells[1, 1]D1,而不是A1。此转变将适用于任何范围对象,不仅包括(但包括)UsedRange

出于这个原因,cells[1, 1] = "AccountNumber";实际上写入了D1而不是A1

解决方案是向后移动范围以补偿添加的插入。您可以在写入单元格之前添加此行:

cells = cells.Offset(0, -3);
cells[1, 1] = "AccountNumber";
// etc...

答案 1 :(得分:1)

int a, b;不一定从A1开始,所以如果您使用的范围是(例如)D1:F20那么UsedRange是D1。

因此,如果您想要可靠地更新工作表上的固定位置,请不要使用UsedRange.Cells[1,1]作为UsedRange的基础。

而是使用类似的东西:

cells