Ramesh Sreeram Ответов: 1

Как отредактировать содержимое ячейки файла excel (.xlsx) в C#


привет,

Я пытаюсь отредактировать некоторые детали в файле excel, но, получив исключение Runtime binder, "не могу выполнить привязку времени выполнения к нулевой ссылке".

Некоторые из манипуляций, которые я пытаюсь сделать, это:

i. переименование имени листа,
ii. замена слова "вчера" на вчерашнюю дату 01/03/2018,
iii. вставьте несколько строк, Если заголовок не находится в ожидаемой строке.


Я добавил ссылку на DLL excel и импортировал пространство имен с помощью Microsoft.Офис.Взаимодействие.Превосходить.

Ниже приведен мой код:


Может ли кто-нибудь подсказать, что я здесь делаю не так?..

Что я уже пробовал:

string folder = Path.GetDirectoryName(@"\\OpsVsAdp\\Files\\Daily\\TempHours.xlsx");
string fileName = Path.GetFileNameWithoutExtension(@"\\OpsVsAdp\\Files\\Daily\\TempHours.xlsx");
string extension = Path.GetExtension(@"\\OpsVsAdp\\Files\\Daily\\TempHours.xlsx");

FileInfo info = new FileInfo(fileName + extension);
{
    // Rename the file as FileName_YYYYMMDD date format.
    string newName = folder + "\\" + fileName + "_" + ISO_Date() + extension;

    if (!File.Exists(newName))
    {
        // info.MoveTo(newName);
    }
}

MyApp = new Excel.Application();
MyApp.Visible = false;
xlBook = MyApp.Workbooks.Open(@"D:\\OpsVsAdp\\Files\\Daily\\TempHours.xlsx");
xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(1); // Explicit cast is not required here
// Modify the sheet name to 'Sheet1'
xlSheet.Name = "Sheet1";
xlBook.Save();

int totalRows = xlSheet.Rows.Count;
int totalCols = xlSheet.Columns.Count;

// replace word 'yesterday' in second row with date
if(xlSheet.Cells[2, 1].Value.Contain("yesterday"))
{
    xlSheet.Cells[2, 1].Value.Replace("yesterday", DateTime.Today.AddDays(-1));
}
// if it is date range, remove the first date
else if (xlSheet.Cells[2, 1].Value.Contain("-"))
{
    int indexOf = xlSheet.Cells[2, 1].Value.IndexOf("-");
    xlSheet.Cells[2, 1].Value.Remove(indexOf, -14);
}

Excel.Range range = (Excel.Range)xlSheet.Columns["A", Type.Missing];
Excel.Range currentFind = null;
Excel.Range firstFind = null;

// Name column header should start from 21st row.
if(xlSheet.Cells[21, 1].Value != "Name")
{
    currentFind = range.Find("Name", xlSheet.Cells[1, 1],
                              Excel.XlFindLookIn.xlValues,
                              Excel.XlLookAt.xlPart,
                              Excel.XlSearchOrder.xlByRows,
                              Excel.XlSearchDirection.xlNext,
                              false,
                              false,
                              false);
}

ZurdoDev

Шаг первый. Какая строка кода вызывает ошибку? Шаг 2. Выясните, что такое null и почему.

Samuel Corpuz

попробуйте сломать и продолжить программу, это может помочь увидеть, что такое нулевое значение и ошибка.

1 Ответов

Рейтинг:
2

Maciej Los

Вы совершили много ошибок...

Пожалуйста, прочтите мои комментарии:

Зачем использовать методы Path класс, если вы можете инициировать переменные напрямую?
Буква диска была пропущена!

//string folder = Path.GetDirectoryName(@"\\OpsVsAdp\\Files\\Daily\\TempHours.xlsx");
//string fileName = Path.GetFileNameWithoutExtension(@"\\OpsVsAdp\\Files\\Daily\\TempHours.xlsx");
//string extension = Path.GetExtension(@"\\OpsVsAdp\\Files\\Daily\\TempHours.xlsx");

Вместо того, чтобы выше, используйте это:
string fullFileName = @"C:\OpsVsAdp\Files\Daily\TempHours.xlsx";


Приведенная ниже часть кода не понадобится, так как вы можете открыть файл в Excel и "переместить" его в другое место с помощью SaveAs метод.
FileInfo info = new FileInfo(fileName + extension);
{
    // Rename the file as FileName_YYYYMMDD date format.
    string newName = folder + "\\" + fileName + "_" + ISO_Date() + extension;

    if (!File.Exists(newName))
    {
        // info.MoveTo(newName);
    }
}


Вы должны использовать fullFileName переменная вместо строки, содержащей путь к файлу. Делать это таким образом называется "хорошей практикой программирования" и позволит вам избежать нескольких ошибок позже.
MyApp = new Excel.Application();
MyApp.Visible = false;
//proper way:
xlBook = MyApp.Workbooks.Open(fullFileName);


Чтобы иметь возможность изменить имя листа, вы должны сначала проверить его имя.
xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(1); // Explicit cast is not required here
// Check and change sheet name to 'Sheet1'
if(xlSheet.Name != "Sheet1")
    xlSheet.Name = "Sheet1";
//you don't need to save a workbook now
//as i mentioned above, you can do it later by using SaveAs method
//xlBook.Save();


totalRows и totalCols переменные были инициированы, но никогда не использовались!
Если вы знаете точный адрес ячейки, содержащей дату (или диапазон дат, или любые другие данные), вы можете изменить ее содержимое напрямую!
//int totalRows = xlSheet.Rows.Count;
//int totalCols = xlSheet.Columns.Count;

// in second row 
// replace word 'yesterday' with date 
// in case of date range, remove the first date
string stmp = (string)xlSheet.Cells[2, 1].Value;
if(stmp == "yesterday")
    xlSheet.Cells[2, 1].Value = DateTime.Today.AddDays(-1);

if (stmp.Contains("-"))
    xlSheet.Cells[2, 1].Value = stmp.Remove(ind, ind);


Извините, но другая часть кода мне не ясна...

Чтобы сохранить книгу в другом месте, вызовите это:
string sNewFileName = Path.Combine(Path.GetDirectoryName(fullFileName), 
	string.Concat(Path.GetFileNameWithoutExtension(fullFileName), "_", DateTime.Today.ToString("yyyyMMdd"), ".xslx"));
xlBook.SaveAs(sNewFileName);
MyApp.Quit();
//read a Final note!


заключительное Примечание: не забывайте освобождать ресурсы! Для получения более подробной информации, пожалуйста, смотрите: Как освободить com-взаимодействия объектов так называемой программы могут покинуть[^]