Remkomplekty.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Excel c visual studio

Работа с Excel с помощью C# (Microsoft.Office.Interop.Excel)

Оставляю заметку по работе с Excel с помощью C#.

Привожу фрагменты кода, которые искал когда-то сам для работы с Excel документами.

Наработки очень пригодились в работе для формирования отчетности.

Прежде всего нужно подключить библиотеку Microsoft.Office.Interop.Excel.

Visual Studio здесь довольно старой версии. Если у вас версия новая, отличаться будет только вид окна.

Далее создаем псевдоним для работы с Excel:

using Excel = Microsoft.Office.Interop.Excel;

Расстановка рамок.

Расставляем рамки со всех сторон:

Цвет рамки можно установить так:

Выравнивания в диапазоне задаются так:

Формулы

Определим задачу: получить сумму диапазона ячеек A4:A10.

Для начала снова получим диапазон ячеек:

Excel.Range formulaRange = sheet.get_Range(sheet.Cells[4, 1], sheet.Cells[9, 1]);

Далее получим диапазон вида A4:A10 по адресу ячейки ( [4,1]; [9;1] ) описанному выше:

string adder = formulaRange.get_Address(1, 1, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

Теперь в переменной adder у нас хранится строковое значение диапазона ( [4,1]; [9;1] ), то есть A4:A10.

Выделение ячейки или диапазона ячеек

Так же можно выделить ячейку или диапазон, как если бы мы выделили их мышкой:

Авто ширина и авто высота

Чтобы настроить авто ширину и высоту для диапазона, используем такие команды:

Получаем значения из ячеек

Чтобы получить значение из ячейки, используем такой код:

Добавляем лист в рабочую книгу

Чтобы добавить лист и дать ему заголовок, используем следующее:

Добавление разрыва страницы

Сохраняем документ

Как открыть существующий документ Excel

Комментарии

При работе с Excel с помощью C# большую помощь может оказать редактор Visual Basic, встроенный в Excel.

Для этого в настройках ленты надо добавить пункт «Разработчик». Далее начинаем запись макроса, производим действия и останавливаем запись.

Далее заходим в редактор Visual Basic и смотрим код, который туда записался:

В данном макросе записаны все действия, которые мы выполнили во время его записи. Эти методы и свойства можно использовать в C# коде.

Данный метод так же может оказать помощь в формировании относительных формул, например, выполнить сложение чисел, находящиеся слева от текущей ячейки на 4 столбца, и т.п. Пример:

Так же во время работы может возникнуть ошибка: метод завершен неверно. Это может означать, что не выбран лист, с которым идет работа.

Excel c visual studio

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Некоторое время назад задался целью найти готовую библиотеку для чтения/записи файлов .xls и .xlsx без установленного приложения Excel
Если Excel установлен, то кажется, что всё просто. Однако: 1) он должен быть установлен 2) есть разница работы с разными версиями офиса — зависим от версии 3) запись больших таблиц работает очень медленно. и т.д., на этом проблемы не заканчиваются.
После серьёзного изучения вопроса, понял, что действительно стоящего варианта — не найдено. Существует несколько библиотек, как свободных, так и платных. Но ни те, ни другие — не удовлетворяют. С чтением таблиц — проблем нет, это делается, например, через MS Jet. А вот запись, тем более — с форматированием, вызывает вопросы.
Задача «минимум» для такой библиотеки:
1) запись файла (например, .xlsx) из dataset — одним вызовом.
2) автоматический подбор ширины столбцов по содержимому (AutoFit)
3) выбор шрифта (хотя бы одного на весь файл) и его размера
4) установка автофильтра на всё содержимое
т.е. получаем файл, готовый к просмотру и к обработке данных без лишних телодвижений вручную. Желательно, чтобы использование библотеки выглядело как можно более лаконично в коде.

Предлагаю обсудить, кто чем пользуется, какие библиотеки рекомендует.

Пробовал EPPlus 2.9, GemBox.Spreadsheet. На крайний случай сгодится, но не очень.

Во многих библиотеках присутствует один и тот же глюк: формат «# ##0,##» до Excel доходит как «# ##0,##».

Generates Excel files from WinForms, WebForms ASP.NET, PocketPC applications, webservices on the fly and fast with FlexCel Studio for .NET
Native .NET components (no additional OLE/dlls required) allowing to read, create and modify native Excel .XLS and .XLSX files without needing to have Excel installed.
Supported Excel 97 .XLS file format and Excel 2007/2010 .XLSX format
Native PDF file export
Exceptionally fast and solid hand tuned .XLS & .XLSX engine capable of generating thousands files per minute.
Able to modify .XLS files and keep almost everything existing on the original file, from macros to activex objects.
Recalculation of more than 200 Excel functions.
Ability to read and write encrypted .XLS files.
Completely written in C# 100% managed code, with NO interop and NO p/invokes!
Runs on .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, Mono and the .NET Compact Framework (xlsx support requires .NET 3.5).
Templates can be stored inside your executable file, in a database or in any place from where you can access it as a stream.
Extensive API is available with which you can programmatically write and read files, with formatting info, images comments, etc.
Export to HTML in HTML 4.01 strict or XTHML 1.1 and fully standards compliant
Report Engine that allows to create complex reports using Excel as your report designer, so your final users can modify them. You can use images/comments/conditional formats/merged cells/pivot tables/charts and almost anything you can think of on those reports.

Читать еще:  Изменение формул в excel

using System.IO;
using System.Globalization;
using System.Drawing;
using FlexCel.Core;
using FlexCel.XlsAdapter;

public void CreateAndSaveFile()
<
XlsFile xls = new XlsFile(true);
CreateFile(xls);

//Save the file as XLS
xls.Save(openFileDialog1.FileName);
>

public void CreateFile(ExcelFile xls)
<
xls.NewFile(1); //Create a new Excel file with 1 sheet.
xls.ActiveSheet = 1; //Set the sheet we are working in.
>
Все имеется. Куча примеров.Могу кинуть на обменник FS. правда немного староват дистр.

Вообще-то не помешает, по крайней мере поизучать. Я сам кое-что попробовал, но форматирование — не прошло, вообще. Не понял пока что не так.

Кстати, YuriyRR, может ты заодно знаешь почему все библиотеки (может не все, но всё что я пробовал — это много) корёжат формат, заданный строкой, я тут уже выше писал:

Вероятно ожидают увидеть формат в английской локали, где в качестве десятичного разделителя используется тчк, а не зпт. Соответственно эскейпят все прочие символы. Или, как вариант, у тебя на машине локаль неправильная стоит.

Добавлено:
Когда-то давно делал репорты в excel на asp.net вообще без библиотек:

— сохраняешь готовый отформатированный пример репорта с одной строчкой в xml
— копи-пастишь как есть в aspx
— находишь строчку с данными и делаешь итерацию по датасету
— бинго! — красивый репорт за 15 мин

Зпт. у них активно используется, как разделитель групп разрядов

Правильная, хотя может быть и нестандартная (что тут вообще стандарт?):
Десятичный разделитель — зпт.
Разделитель групп разрядов — пробел

Возможно англоязычные разработчики не догадываются, что русские могут использовать запятую таким странным образом

Имеет смысл проверить на машине с en-US и с английским же форматом, а потом уже смотреть где валится на русской, да еще и с хитрой локалью.

Excel c visual studio

БлогNot. Visual C++: табличные компоненты и работа с ними

Visual C++: табличные компоненты и работа с ними

В этой статье мы рассмотрим на простых примерах основные приёмы работы с табличными компонентами .NET, среда для выполнения кода — Visual C++ (Studio) Express 2010 или выше.

Пример 1. Пишем приложение TableEditor1 для редактирования таблицы и сохранения её в формате XML.

На форму добавим компоненту dataGridView1 , а объекты DataTable и DataSet создадим программно.

Для этого опишем глобально в классе формы следующие величины:

На загрузку формы реализуем такой код (обработчик события Load ):

Перед закрытием формы выполним следующий код (обработчик события FormClosing ):

Данные сохраняются в формате XML.

DataSet представляет собой кэш данных, расположенный в оперативной памяти. DataSet состоит из коллекции объектов класса DataTable .

Доступ к ячейкам таблицы можно получить, используя свойства класса DataTable ( Rows , Cols , Item ) — но запись поля таблицы в файл может быть некорректной из-за того, что технология ADO.NET предусматривает кэширование данных.

Пример такого кода:

Поэтому следует пользоваться методами объекта DataSet .

Скачать проект TableEditor1 в архиве .zip (13 Кб)

Пример 2. Пишем проект TableEditor2 для связанных таблиц.

Компонента DataGrid — решение для показа связанных таблиц в одной компоненте, в DataGridView такой возможности нет. Не все компоненты доступны по умолчанию, в том числе, и DataGrid . Щёлкаем правой кнопкой мыши на панели элементов управления, Выбрать элементы, на вкладке «Компоненты .NET Framework» устанавливаем флажок возле элемента DataGrid пространства имен System.Windows.Forms , нажимаем ОК.

После этого DataGrid можно добавить на форму.

На загрузку формы (обработчик события Load ):

На нажатие кнопки (переключает между родительской и дочерней таблицами):

Читать еще:  Область печати в excel 2020

Скачать проект TableEditor2 в архиве .zip (14 Кб)

Пример 3. Делаем всё по-современному — через DataGridView . Подробнее об этом компоненте.

Он представляет собой прямоугольный массив ячеек, который можно рассматривать как коллекцию строк или столбцов.

Rows — коллекция строк, имеет тип DataGridRowCollection

Columns — коллекция столбцов, тип DataGridColumnCollection

Оба свойства индексируются как массивы для доступа к конкретной строке/столбцу, нумерация с нуля.

Cells — коллекция ячеек из объекта DataGridRowCollection , приведём пример доступа к ячейке:

RowCount , ColumnCount — количество строк и столбцов

В несвязанном режиме компонент может отображать любые табличные данные.

Методы для добавления/удаления/редактирования строк относятся к коллекции Rows и имеют типовые имена: Add , Insert , Clear , AddCopy , InsertCopy , Remove , RemoveAt и могут иметь по несколько перегрузок каждая, например, для Add есть версии Add() , Add(КоличествоНовыхСтрок) , Add (DataGridViewRow ^row) , Add (. Object ^object)

Настройка внешнего вида компонента также типовая: такие свойства, как BackColor , Alignment , Font и т.д. находятся в объекте типа DataGridViewCellStyle

Каждая ячейка представлена объектом System::Windows::Forms::DataViewCell , за «личный» внешний вид ячейки отвечает свойство InheritedStyle , вид по умолчанию — DefaultCellStyle

1. По нажатию кнопки перекрасим фон таблицы в розовый цвет:

2. . или только фон выбранной ячейки:

Значения cell_y , cell_x описаны глобально в классе формы:

инициализируются в обработчике её события Load :

и получаются значения в обработчиках событий dataGridView1_KeyUp , dataGridView1_MouseUp (одинаковым кодом):

3. Обработчик события dataGridView1_CellFormatting для выделения текущей ячейки жёлтым фоном:

4. Сделаем в dataGridView1 таблицу со значениями функции. Код по нажатию кнопки:

5. Есть также множество событий, связанных с редактированием ячейки: CellBeginEdit , CellEndEdit , CellParsing , CellValidating , CellValidated и т.д.

Например, по умолчанию наша таблица редактируется. Чтобы разрешить в первом столбце ( Y(X) ) ввод только числовых значений, напишем следующий код, выполняемый по событию CellValueChanged :

Величина lastValue описана в классе формы:

и, по событию CellBeginEdit , сохраняет предыдущее значение, хранимое в ячейке:

Скачать проект TableEditor3 в архиве .zip (14 Кб)

16.03.2015, 15:33; рейтинг: 15258

Как легко создать Excel UDF с проектом надстройки VSTO

16 [2009-06-05 22:07:00]

То, что я пытаюсь сделать, — создать пользовательские функции (UDF) для Excel, используя VSTO С# «Excel 2007 Add-in» — тип проекта (так как я просто хочу сгенерировать некоторые общие UDF). Поскольку я только пытаюсь изучить основы (на этом этапе так или иначе), это то, как выглядит мой код:

Он отлично компилируется, и когда я его запускаю, Excel появляется со свежей электронной таблицей, и когда я смотрю на «Add-Ins» -list (в вариантах Excel), я могу видеть свою надпись в списке ( который установлен на «Загрузка при запуске». Но вот моя проблема, когда я пытаюсь вызвать свой UDF из встроенного Excel, Excel не может найти метод!

То, что я представляю, ошибочно, заключается в том, что я должен пометить свой метод как Excel UDF (используя квадратные скобки — как это делается, например, при кодировании веб-сервисов → «[WebService]» ). Но я не смог отследить этот тег (и, поскольку я не уверен, если моя догадка верна), вот почему я решил пойти к вам, прекрасные люди здесь, в SO.

Итак, мой вопрос в основном — от того, где я с моим кодом, есть ли простой способ сделать мой UDF доступным для Excel? Если да, то как?

Я действительно хотел бы остаться в рамках проектов проекта VSTO (надстройка, рабочая книга, шаблон), так как моя общая цель для моего текущего проекта — установить, работает ли выполнение С# UDF с VS2010/Excel2007 на приемлемом скорость. Чтобы проверить это, я работаю над Windows7RC и с VS2010 beta1.

c# visual-studio-2010 excel-2007 vsto

4 ответа

19 Govert [2009-06-12 15:38:00]

VSTO не поддерживает создание Excel UDF. Надстройки надстройки могут быть созданы в .Net и, похоже, одобрены Microsoft.

Вы должны взглянуть на ExcelDna — http://www.codeplex.com/exceldna. ExcelDna позволяет управляемым сборкам предоставлять пользовательские функции (UDF) и макросы в Excel через собственный .xll-интерфейс. Проект является открытым исходным кодом и свободно разрешает коммерческое использование. И вы обнаружите, что производительность вашего UDF на базе .NET аналогична встроенным надстройкам .xll для Excel. Функции Excel 2007, такие как большой лист, поддерживаются длинные строки Unicode и многопоточный пересчет.

С ExcelDna ваша функция, опубликованная выше, будет открыта для Excel без VSTO — вы можете поместить код в xml-основанный .dna файл или скомпилировать его в .dll.

Читать еще:  Арккосинус в excel

Файл .dna, отображающий ваш UDF, будет выглядеть так:

Обновление:. В наши дни самым простым способом начать работу с Excel-DNA является создание нового проекта библиотеки классов в Visual Studio, а затем добавление пакета «ExcelDna.AddIn» из NuGet. Это делает надстройку стартера — просто вставьте свой код и нажмите F5 для запуска.

Насколько я знаю, вы не можете напрямую создавать UDF в VSTO.

См. статью Пола Стаббса Как создать Excel UDF в управляемом коде VSTO, где он использует надстройку VBA для публикации VBA UDF, которая в свою очередь, вызывать его управляемые UDF, написанные в VSTO.

Вы можете использовать управляемый код для создания UDF, однако, когда не используете VSTO. См. Статью Эрика Картера Написание пользовательских функций для Excel в .NET о том, как это сделать.

Что касается скорости выполнения VSTO, я думаю, вы найдете все в порядке для практически всех задач. Однако, зацикливание через ячейки, которое уже является слабым местом Excel, может быть болезненно медленным, в зависимости от того, что вы делаете. Постарайтесь выполнять все в пакетном режиме, насколько это возможно. Например, вместо того, чтобы перебирать ячейки по одному, возвращаем двухмерный массив значений из области, обрабатываем массив и затем передаем его обратно в диапазон.

Чтобы продемонстрировать, следующее возвращает двухмерный массив значений из области, обрабатывает значения, а затем передает результирующий массив обратно в исходную область за один снимок:

.NetBlog — блог о программировании на C# .Net, и других, не мене интересных вещах.

Заметки о разработке ПО, советы по .net, SharePoint, SQL, архитектура приложений, литература по программированию. А также просто просто мысли о жизни и рассказы о том, что интересно автору, например путешествиях и вкусной еде 😉

суббота, 11 октября 2014 г.

COM Interop на примере работы с Excel

В предыдущем посте я писал о создании csv-файла и экспорта в него данных из ASP.NET и при этом, перечисляя разные варианты, не упомянул один совсем уже бредовый для web-приложения, но частенько очень подходящий для приложений десктопных. Это работа с установленным в системе COM-объектом c помощью технологии под названием COM Interop.

COM Interop используется в .Net для предоставления возможности взаимодействия управляемого .Net кода с COM-объектами. Тля того чтобы использовать какой-либо COM-объект из управляемого кода, необходимо создать сборку, содержащую информацию о типах содержащихся в COM-библиотеке, в совместимом с CRL формате.

В процессе работы приложения CLR создает для каждого COM-объекта внутренний объект, называемый Runtime Callable Wrapper (Вызываемая оболочка времени выполнения) или RCW, которая используется для создания COM-объекта и маршалинга данных между управляемой и неуправляемой средой. Также, RCW используется для мониторинга количества активных ссылок на COM-объект и его уничтожение, когда количество активных ссылок станет равным нулю. Выглядит это примерно так:

Обычно, если вы ходите создать CLR библиотеку для какого-либо компонента самостоятельно, то вам нужно использовать утилиту Tlbimp.exe, но для использования компонентов Office этого делать не нужно. Все необходимые библиотеки уже устанавливаются вместе с продуктом. Нам достаточно только добавить нужную сборку в проект.

И добавить соответствующую строку using в ваш код

using Excel = Microsoft.Office.Interop.Excel;

В качестве источника данных для примера будем использовать список массивов строк ( List ). В коде я написал комментарии, которые, думаю, будут вполне понятно объяснять что происходит.

Ну и пара нюансов с которыми вы можете столкнуться. В случае, если в COM-компоненте происходит исключение, которое вы не обработаете, то, как и положено, весть домен приложения будет аварийно закрыт. Вместе с RCW. В результате чего, COM-объект так и останется висеть в памяти. То есть, вполне реально получить вот такую картинку:

И нюанс второй. Код сверху не совсем правильный. Дело в том, что работая с COM Interop нужно быть предельно внимательным и осторожным, потому, что случайно можно создать COM-объект, совершенно об этом не подозревая. В данном случае, создается даже не один «случайный» объект, а несколько.
Во-первых, в строке xlsWB = App.Workbooks.Add(missingValue); создается объект App.Workbooks, который не присваевается переменной и, соответственно, не освобожается дл тех пор, пока не выгрузится домен приложения.
Во-вторых, такая же проблема в строке в строке: xlsSheet = (Excel.Worksheet)xlsWB.Worksheets.get_Item(1);

Для того, чтобы эту проблему решить необходимо добавить две новые переменные и немного изменить код инициализации:

Ссылка на основную публикацию
Adblock
detector