Итак, .NET не имеет встроенной функциональности Office? - PullRequest
3 голосов
/ 10 сентября 2009

Я всегда думал, что это так, хотя я не знаю, откуда у меня появилась идея ... Я всегда предполагал, что электронную таблицу легко рассматривать, например, как двумерный массив, но некоторые поиски в SO предполагают, что все используя сторонние библиотеки? Или все эти люди нуждаются в решениях, которые не требуют установки Office ... если у меня нет этого ограничения, становится ли легче?

Как я уже сказал, я посмотрел на SO, но не увидел ответа на этот конкретный вопрос. Однако, возможно, мои навыки поиска просто отстой ...

РЕДАКТИРОВАТЬ: Идея в том, что я хочу открыть документ XLS / CSV в приложении на C #. Мне не нужны сложные данные из ячеек, просто возможность прочитать текстовое значение из каждой ячейки. В идеале, оболочка, которая обрабатывает электронную таблицу как двумерный массив ячеек с методом Cell.getText (), - это все, что мне нужно.

Ответы [ 13 ]

7 голосов
/ 10 сентября 2009

Да, .NET имеет встроенную функциональность Office . Но ты будешь избивать себя, пытаясь использовать это. Он также хорошо спрятан и совместим только с Office 2007 и более поздними версиями (если только вы не загрузите надстройку совместимости для Office 2003 / XP).

Лучше использовать некоторые API-интерфейсы, предназначенные для взаимодействия с Office , чем пытаться работать в одиночку. Ссылка предназначена для Office Open XML SDK, который можно использовать для создания файлов. * X Office (.docx, .xslx и т. Д.).


Если вам интересно, как System.IO.Packaging относится к Office, здесь начинается след документа:

http://msdn.microsoft.com/en-us/library/dd371623(VS.85).aspx

Сокращенная версия - новые офисные форматы Открытые XML-документы . Что такое документы Open XML? Это пакеты ресурсов (например, изображений) и файлы XML, содержащиеся в ZIP-файле. Вы можете взять любой из новых файлов Office, изменить расширение на .zip и открыть их для ознакомления.

Что это значит? Это означает, что вы можете разархивировать эти файлы, загрузить их как XDocuments и отправиться в город. Конечно, вы должны разархивировать файлы во временную папку, отсортировать несколько файлов XML, чтобы найти те, которые вам нужны, управлять всеми соединениями между файлами при их изменении, и т. Д. И т. Д. И т. Д.

Или вы можете использовать пространство имен System.IO.Packaging и его типы, чтобы открывать эти файлы, получать доступ к различным компонентам в пакетах (даже удаленно), изменять их и сбрасывать изменения на диск.

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

Именно поэтому MS предоставила Open XML SDK, который можно использовать в сочетании с System.IO.Packaging для открытия, изменения и сохранения офисных документов Open XML.

Добавьте мою первую ссылку с моей второй ссылкой , и вы получите ответ на исходный вопрос.


Чтобы ответить на разъяснения ОП, это будет не так просто. xls документы сложны; ячейки - это не просто двумерный массив. Но есть бесплатные API, которые помогут вам открыть и получить доступ к данным в них.

Если вы хотите открыть файлы, совместимые с Office 2007, я настоятельно рекомендую проверить Office Open XML SDK. Если вы хотите открыть более старые версии (Office 2003, XP), я бы предложил использовать один из многих проектов для Excel на codeplex.com (я думаю Я использовал Excel Data Reader ). Их довольно много, чтобы облегчить доступ к данным в таблицах Excel. Но не совсем лист [х] [у] легко.

4 голосов
/ 11 сентября 2009

Если вы хотите открыть файлы .XLS (Excel 97-2003) более старого формата, в отличие от более нового * .XLSX, вы можете попробовать JET-провайдер:

OleDbConnection con = new OleDbConnection(string.Format(
                 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"",
                 "filename.xls"
                 ));
con.Open();
OleDbDataAdapter ad = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", con);
DataTable t = new DataTable();
ad.Fill(t);

Это помещает данные в DataTable, где им довольно легко манипулировать.

2 голосов
/ 11 сентября 2009

Я думаю Excel Data Reader поможет. Вы можете читать файлы Microsoft Excel ('97 -2007) непосредственно в наборе данных.

Вот пример кода (с сайта):

FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

//1. Reading from a binary Excel file ('97-2003 format; *.xls)
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
//...
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();
//...
//4. DataSet - Create column names from first row
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();

//5. Data Reader methods
while (excelReader.Read())
{
    //excelReader.GetInt32(0);
}

//6. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();
2 голосов
/ 10 сентября 2009

Не уверен, что именно вы хотите сделать, но есть целый сайт для этого, чтобы работать с Office в Visual Studio.

Понимание объектной модели Excel с точки зрения разработчика Visual Studio 2005

Возможно, вам понадобятся инструменты Visual Studio для Office.

2 голосов
/ 10 сентября 2009

Visual Basic (или, по крайней мере, был) лучше языков .NET для работы с приложениями Office, хотя вы также можете использовать C #.

Программирование офисных приложений .

0 голосов
/ 23 февраля 2010

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

    internal void OpenSearchAndReplace(string path, Logger log)
    {
        object nullobj = System.Reflection.Missing.Value;
        ConfigurationManager conf = new ConfigurationManager();

        try
        {
            if (_excelApp == null)
                _excelApp = new Excel.Application();

            Excel.Workbook book = _excelApp.Workbooks.Open(path, nullobj, nullobj, nullobj, nullobj, nullobj, nullobj,
                                                           nullobj, nullobj, nullobj, nullobj,
                                                           nullobj, nullobj, nullobj, nullobj);
            Excel.Worksheet worksheet;
            if( book.Worksheets.Count > 1 )
                worksheet = (Excel.Worksheet)book.Worksheets.get_Item("Sheet1");
            else
                worksheet = (Excel.Worksheet)book.ActiveSheet;

            Excel.Range range = worksheet.UsedRange;

            object[,] values = (object[,])range.Value2;

            for (int row = 1; row <= values.GetUpperBound(0); ++row)
            {
                for (int col = 1; col <= values.GetUpperBound(1); ++col)
                {
                    string value = Convert.ToString(values[row, col]);
                    if (Regex.IsMatch(value, @conf.GetFullyQualifiedRegExp()))
                    {
                        range.Cells.set_Item(row, col, conf.GetReplacementText());
                    }
                }
            }
            book.Save();
            Marshal.ReleaseComObject(worksheet );

            log.LogExcelFile( "File " + path + " has been processed\n" );
        }
        catch (Exception ex)
        {...}

Но, пожалуйста, не забудьте заставить сборщик мусора, если вы не хотите, чтобы вокруг было много объектов :):

            // Force the garbagecollector to kill objects. 
            // Waiting for it to finish
            GC.Collect();
            GC.WaitForPendingFinalizers();
0 голосов
/ 15 октября 2009

Попробуйте использовать http://www.codeplex.com/xlslinq

Следующий пример находит рабочие таблицы по имени рабочей таблицы.

using(XlsWorkbook book = new XlsWorkbook("TestData\\100.xls")) {

    var sheets = from s in book.Worksheets
                 where s.Name == "100"
                 select s;

    foreach(var sheet in sheets) Console.WriteLine(sheet.Name);
}
0 голосов
/ 11 сентября 2009

На самом деле, я бы сказал, что это совсем наоборот ... Так что у Office все еще нет функциональности .Net? Было бы неплохо иметь альтернативу построения макросов в .Net, а не привязываться к VBA.

Я знаю, что могу сделать эквивалент из проекта расширения Office в Visual Studio, но я говорю о чем-то, что было бы более "родным" для самого Office. Для некоторых сценариев выполнение проекта по расширению является таким большим излишним.

0 голосов
/ 11 сентября 2009

Джон,

Это зависит от окружающей среды. Мы делаем почти то же самое с нашим приложением. Мы использовали Interop до недавнего времени. Его не так сложно использовать, если вы не оставляете COM-компоненты без дела.

К сожалению, недостатком является то, что Office 2007 не поддерживает какую-либо автоматизацию сервера (без неприятных взломов ОС), поэтому, если вы работаете в среде без автоматизации пользовательского интерфейса / задач, то вы не сможете используйте Interop.

Я думаю, вы можете использовать такие вещи, как ADO, но у них нет той же концепции ячеек, поэтому она не работает для того, что нам нужно.

В качестве альтернативы есть несколько хороших библиотек, посмотрите мой обзор из них. FlexCel был нашим предпочтительным выбором, который мы приобрели. Дешево, быстро и очень удобно.

0 голосов
/ 11 сентября 2009

Вы пытались посмотреть Инструменты Visual Studio для Office ? Это полностью управляемый API для работы со всеми приложениями Office.

Существует немало разработок, использующих VSTO, судя по форумам и т. Д. Вот вспомогательный API для работы с VSTO, с использованием LINQ и т. Д.

VSTO Электроинструменты

...