Небольшой совет по взаимодействию с C # - Excel - PullRequest
1 голос
/ 10 января 2012

Добрый день, парни,

Хотелось бы получить небольшой совет: я подхожу к проблеме, из-за которой мне нужно написать агент, который перейдет в определенный каталог файлов, откроет книгу Excel (которая уже существует) и затем изменит значение двух. ячейки (которые всегда являются одинаковыми ячейками) для текущего месяца (во время работы агента).

К сожалению, это рабочий проект, поэтому VSTO закрыт. ExcelDNA, однако, я использовал раньше. Я не ищу кого-то, кто бы «делал свою работу», но любые предложения о том, где искать или предыдущие примеры были бы хорошими.

Я безрезультатно копошился, если бы кто-нибудь мог указать мне правильное направление для начала, это было бы здорово!

Очень ценится.

Ответы [ 4 ]

1 голос
/ 11 января 2012

Excel-DNA отлично подходит, если вы хотите создать надстройку Excel в .NET с пользовательской функцией и т. Д. Но похоже, что вы просто хотите автоматизировать Excel из внешнего исполняемого файла.

Для этого проще всего напрямую установить и сослаться на основные сборки взаимодействия (PIA), которые вы можете найти здесь: http://www.microsoft.com/download/en/details.aspx?id=3508, или вы можете использовать блестящие независимые от версии сборки взаимодействия в NetOffice проект.

В обоих случаях вы создаете консольное приложение VB.NET или C #, затем добавляете ссылку на выбранные вами сборки взаимодействия, и все готово.

В C # ваш метод, использующий NetOffice, может запуститься следующим образом (я думаю, что в C # 4 он может быть немного чище):

static void Test()
{
    // Initialize Api COMObject Support
    LateBindingApi.Core.Factory.Initialize();

    // start excel and turn off msg boxes
    Excel.Application excelApplication = new Excel.Application();
    excelApplication.DisplayAlerts = false;

    // add a new workbook
    Excel.Workbook workBook = excelApplication.Workbooks.Add();
    Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Worksheets[1]; 

    worksheet.get_Range("A1").Value = "XXX";

    // save the book 
    string fileExtension = GetDefaultExtension(excelApplication);
    string workbookFile = string.Format("{0}\\Example01{1}", 
                       Application.StartupPath, fileExtension);
    workBook.SaveAs(workbookFile, Missing.Value, Missing.Value, Missing.Value,
               Missing.Value, Missing.Value, XlSaveAsAccessMode.xlExclusive);

    // close excel and dispose reference
    excelApplication.Quit();
    excelApplication.Dispose();
}
0 голосов
/ 13 июня 2012

почему бы не использовать ExcelDNA? Это может сделать Excel-файл более независимым от работающего агента. Если есть DLL (или даже файл ДНК), который предоставит желаемые значения, эти две ячейки могут быть заполнены простой функцией. Преимущество в том, что вам не нужно сначала запускать агента, просто откройте рабочую книгу. Недостатком является то, что файл ExcelDNA.xll и все остальное, что вам нужно для предоставления желаемых значений, должны быть развернуты на каждой клиентской машине, которая откроет книгу. Или вы должны преобразовать формулы этих двух ячеек в реальные значения, прежде чем публиковать их. В этом случае взаимодействие может быть лучше.

Надеюсь, это поможет.

Приветствие Lothy

0 голосов
/ 10 января 2012

Просто подумав вслух с Excel, теперь имеющим формат файла с резервной копией xml (в архиве), может быть проще сделать это изменение, проанализировав и переписав xml, или использовать преобразование xml [дрожь].

Теперь более поддерживаемый способ - использовать VSTO, но вы говорите, что он недоступен.Если вы посмотрите дальше на синтаксический анализ формата файла, помните, что это сложная схема, вы можете найти источник, который поможет вам.

$ 0,02

0 голосов
/ 10 января 2012

Я могу предложить OpenXml Sdk , если вы используете Excel 97 или выше

...