Показаны сообщения с ярлыком MS Office. Показать все сообщения
Показаны сообщения с ярлыком MS Office. Показать все сообщения

суббота, 11 декабря 2010 г.

среда, 12 мая 2010 г.

Обновил ExcelExportLib до версии 1.4.0.0

Собственно, обновление здесь. Много чего интересного, в частности:

- теперь можно использовать формулы в ячейках.
- можно задавать имена ячейкам. Имена должны быть уникальны. Имена можно использовать в формулах
- можно задавать комментарии для ячеек. Причем с форматированием

Вообщем, теперь можно получить что-то вроде этого:


суббота, 21 февраля 2009 г.

ExcelExportLib v1.0.0.0

Решил оформить предыдущий эксперимент по выгрузке данных в Excel .xml файл в виде библиотеки. Встречайте - ExcelExportLib v1.0.0.0

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

пятница, 13 февраля 2009 г.

Запись и чтение из файлов Excel при отсутствии установленного Excel #2

Иногда просматриваю статистику по блогу в Google Analytics. С момента публикации поста про Запись и чтение из файлов Excel при отсутствии установленного Excel он уверенно держится в топе по посещаемости :) Хотя последнее время пост про горячие клавиши Windows начал выходить на первое место. Ну да ладно...

Решил я тут еще немного поделиться сакральным знанием про Excel, а именно - рассказать еще один способ формирования файлов, понятных для этой программы.

Как известно, Excel понимает много разных форматов файлов. Среди них есть "Таблица Xml (*.xml)". Достоинств у этого формата аж три штуки:

  • корректно распознается системой как файл Excel, несмотря на то, что имеет расширение .xml
  • имеет относительно простую структуру, легко просматривается/правится даже в блокноте
  • полностью сохраняется форматирование страниц, таблиц и ячеек, заданное посредством Excel

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

Каждая таблица содержит набор колонок, строк и ячеек.

Колонки задают размеры колонок, способ форматирования текста (например, перенос по словам) и т.п. Внимание! Автоматическое расширение колонки работает только для числовых полей и дат (имхо - извращение, впрочем, это совершенно нормально для Microsoft).
Пример:
   <column ss:width="200.25">
   <column ss:autofitwidth="1" ss:width="60">
Каждая строка имеет номер (индекс) и разные параметры. Если индекс не указан, считается, что строка находится ниже предыдущей. Индексация начинается с единицы.

Каждая ячейка имеет номер (индекс), стиль и разные параметры. Тип данных в ячейке задается через вложенный тэг . Пример:

   <cell ss:styleid="s21"><data ss:type="DateTime">2009-02-02T00:00:00.000</data></cell>
   <cell><data ss:type="String">строка</data></cell>
Вообщем-то и все. Остальное можно прочитать в мануале или же сформировать файл в Excel, сохранить и посмотреть что получилось.

Посидев немного я написал соответствующий набор классов , которые позволяют сформировать простенький Excel-xml файл. Я сознательно не использую никакие функции для работы с xml и формирую файл как обычный текст. Так быстрее. Универсальность как конечная цель не ставилась - соответственно можно сделать только одну таблицу, стили жестко зашиты в коде. Ну и т.д. и т.п.

Пример использования:


   ExcelTable table = new ExcelTable("Таблица");

   table.columns.Add(new ExcelColumn(false, 260));
   table.columns.Add(new ExcelColumn(true, 60)); //autofit = 1

   ExcelRow row = new ExcelRow();
   row.AddCell("Заголовок1");
   row.AddCell("Заголовок2");
   table.AddRow(row);

   row = new ExcelRow();
   row.AddCell("дата");
   row.AddCell(DateTime.Now, eDateType.Date);
   table.AddRow(row);

   row = new ExcelRow();
   row.AddCell("отмеченное число");
   row.AddCell(25, true);
   table.AddRow(row);

   table.Save("test.xml")

Как видите - ничего сложного. Пользуйтесь :)

понедельник, 20 октября 2008 г.

Запись и чтение из файлов Excel при отсутствии установленного Excel

Получил на днях очередной бюллетень-молния Technet от Microsoft (кстати, интересная штука, кто еще не подписан - рекомендую. Такой же бюллетень есть и для MSDN). И были там две интересных ссылки: How Can I Write to Excel Without Using Excel? и How Can I Read from Excel Without Using Excel?

Собственно, идея очень простая - надо открыть OleDb-соединение и вперед, с песней :)

Берем вот такой .xls-файл:


Чтение данных делаем так:

            string fileName = @"test.xls";
            string sheetName = "Sheet$";
            string connString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " +
                                       fileName +
                                       "; Extended Properties=Excel 8.0";
            string query = "Select * from [" + sheetName + "]";

            OleDbConnection conn = new OleDbConnection(connString);
            OleDbCommand cmd=new OleDbCommand(query, conn);
            conn.Open();

            OleDbDataReader reader = cmd.ExecuteReader();

            textBox1.Text = "";

            while (reader.Read())
            {
                textBox1.Text += System.Environment.NewLine;
                textBox1.Text += reader.GetString(0) + " ("+reader.FieldCount+")";
            }

            reader.Close();
            conn.Close();

Результат будет примерно таким:

А запись данных так:

            string fileName = @"test.xls";
            string sheetName = "Sheet$";
            string connString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " +
                                       fileName +
                                       "; Extended Properties=Excel 8.0";
            string wquery = "Insert into [Sheet$] (Name,Data) Values (?,?)";

            OleDbConnection conn = new OleDbConnection(connString);
            OleDbCommand wcmd=new OleDbCommand(wquery, conn);
            conn.Open();

            OleDbParameter namep = wcmd.Parameters.Add("Name", OleDbType.VarChar, 80);
            OleDbParameter datap = wcmd.Parameters.Add("Data", OleDbType.UnsignedInt, 16);

            namep.Value = "aaa";
            datap.Value = 15;

            wcmd.ExecuteNonQuery();;

            conn.Close();

Результат, соответственно, такой:

Вот так вот всё просто. Я надеюсь, что найти где это можно применить сможете сами :)