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

19 августа 2021

Разделение по диагонали ячейки MS Excel с двумя значениями

    Существует много способов разнообразить внешний вид таблицы в MS Excel. Например, иногда таблица может стать более наглядной, если в одной ячейке разместить сразу два значения, разделив ее по диагонали на две части. Одним из вариантов использования такой ячейки является шапка таблицы, в ячейке которой сразу два заголовка – для строк и для столбцов.
Таблица MS Excel с разделением ячейки по диагонали

11 августа 2021

Использование нескольких шрифтов и цветов в одной ячейке MS Excel одновременно

    Каждое слово или буква в ячейке MS Excel может иметь свой шрифт, стиль шрифта, цвет и размер. Это позволяет сделать таблицу более наглядной и удобочитаемой. Для подобного форматирования ячейки достаточно перевести ее в режим редактирования нажатием клавиши F2 или двойным кликом левой кнопки мыши, выделить нужный участок текста и поменять параметры его шрифта. Как это сделать программным способом?

03 августа 2021

Как снять защиту книги MS Excel не зная пароль?

    MS Excel позволяет защитить структуру книги паролем, что запретит другим пользователям манипуляции с ее листами. Не зная пароль нельзя добавлять, перемещать, удалять, скрывать и переименовывать листы, а также просматривать скрытые ранее листы. Звучит красиво. Но защита книги очень ненадежна и ее легко можно снять тем же способом, как я снимал защиту с листа MS Excel.

25 августа 2020

Как снять защиту листа Excel не зная пароль?

    Предположим, что вам дали файл в формате MS Excel. Вы хотите его изменить, но автор файла защитил ячейки листа от редактирования и забыл сообщить пароль.
Можно попытаться узнать пароль, а можно снять защиту с помощью любого архиватора, который умеет работать с архивами в формате ZIP.

29 марта 2020

Создание выпадающего списка в ячейке электронной таблицы

    Современные программы для создания электронных таблиц имеют много интересных функций, которые делают работу пользователя с данными более комфортной. Одна из таких функций "Проверка данных" ("Data Validation") позволяет контролировать корректность ввода данных в ячейке электронной таблицы. Контроль достигается за счет ограничения типа данных или значений, которые можно ввести в ячейку. Одним из часто используемых применений механизма проверки данных является создание выпадающих списков. Давайте посмотрим, как создать выпадающий список в ячейке электронной таблицы "руками" в Google Таблицы и Microsoft Excel. А также создадим его из программы.

09 октября 2019

Работа с файлами формата MS Excel в программе под Linux

    Продолжая тему обработки файлов формата MS Excel в программах на Delphi, поговорим об их обработке в программе под Linux. Такую возможность программистам на Delphi предоставляет библиотека TMS FlexCel. Она позволяет работать с файлами формата MS Excel под всеми операционными системами, под которые Delphi умеет создавать исполняемый файл: Windows, Linux, Android и iOS.

16 сентября 2019

Запись в MS Excel. Кто быстрее?


    В марте этого года я протестировал скорость чтение информации из файла MS Excel библиотеками работающие с файлом MS Excel "напрямую" (Чтение из MS Excel. Кто быстрее?). Сегодня давайте взглянем, как эти библиотеки справляются с записью файла.
    Мой тест создает новый XLSX-файл с одним листом, на который записывает 10000 строк по 100 столбцов.
const
  ciRowCount = 10000;
  ciColCount = 100;
Каждая библиотека формирует файл 10 раз и результатом теста является среднее время. В качестве компилятора использована RadStudio v10.3.2. А результаты подтверждены на другом компьютере с компиляцией в RadStudio v10.3.1.

09 сентября 2019

Новый генератор XLSX-файлов в EhLib 9.4

    В EhLib всегда была возможность экспорта содержимого DBGridEh в MS Excel. Но EhLib версии 9.4 была дополнена новым классом TXlsMemFileEh, который не привязан к DBGridEh и является настоящим генератором файлов в формате MS Excel. Т.е. при желании используя TXlsMemFileEh можно создавать XLSX-файлы на основании любых данных.

18 марта 2019

Чтение из MS Excel. Кто быстрее?


    При написании "Заполнение страницы MS Excel одной командой" я вспомнил про библиотеки работающие с файлом MS Excel "напрямую". Посмотрим, насколько чтение информации из MS Excel "напрямую" быстрее, чем при использовании OLE.
    Создадим файл с 1 000 000 строк по 5 столбцов и прочитаем его различными способами.

11 марта 2019

Заполнение листа MS Excel одной командой


 "А чё, так можно было, что ли?!?"
 © Уральские пельмени

    Недавно, правя баги в чужом проекте, я в методе генерации отчета в шаблон MS Excel обнаружил то, о чем сам никогда не задумывался... Среди сотни строк присвоения значений ячейкам, я заметил, что одна таблица из сотни ячеек копируется на лист MS Excel одной строкой...
    Алгоритм очень прост: создаем динамический двумерный вариантный массив, заполняем его значениями и присваиваем диапазону ячеек:

21 февраля 2019

Автоподбор высоты строки MS Excel после объединения ячеек

    Шел 2019-й год... а MS Excel по-прежнему не научился рассчитывать высоту строки если в ней есть объединённые ячейки... И метод Range.AutoFit, который "Changes the height of the rows in the range to achieve the best fit", нас не спасёт.

Например, объединим ячейки A1 и B1 и поместим в них многострочный текст:
Var
  ea: TExcelApplication;
  ovRange: OleVariant;
begin
  ...
  ovRange := ea.Range['A1', 'B1'];
  ovRange.Merge;
  ovRange.Value := '1'#13#10'2'#13#10'3'#13#10'4'#13#10'5';
  ovRange.EntireRow.AutoFit;

15 сентября 2011

Конвертирование XLS/XLSX/XLSM в XLSB

   С появлением MS Excel 2007 на смену привычного XLS-файла пришли сразу три формата:
  • XLSX - стандартный формат файлов Excel 2007-2010 на основе XML;
  • XLSM - формат Excel 2007-2010 на основе XML с поддержкой макросов (в отличие от XLSX он позволяет сохранять код макросов MS Visual Basic для приложений (VBA) и листы макросов MS Excel 4.0 (XLM));
  • XLSB - формат двоичных файлов Excel 2007-2010 (BIFF12).
Наиболее интересным из них является формат XLSB - Excel Binary Workbook. В отличие от других форматов Excel 2007-2010, он хранит данные не в виде XML, а является двоичным. Это дает существенные преимущества при работе с большими таблицами, т.к. бинарные файлы занимают меньше места на диске и читаются/записываются быстрее.
   Ни одна из библиотек для работы с файлами Excel в Delphi не поддерживает XLSB-формат. Например, XLSReadWrite поддерживает только XLSX, а авторы TMS FlexCel вообще не могут сказать, когда у них будет поддержка формата Excel 2007 и будет ли вообще. Поэтому, что бы конвертировать файлы Excel в XLSB-формат необходимо использовать OLE:

Var
  xls: OleVariant;
...
Const
  // formats in Excel 2007-2010
  xlExcel12 = 50; // XLSB
  xlOpenXMLWorkbook = 51; // XLSX
  xlOpenXMLWorkbookMacroEnabled = 52; // XLSM
  xlExcel8 = 56; // XLS (export to Excel 97-2003)
...

Procedure XYZ.ConvertFilesToXLSB(slFiles: TStringList);
Var
  iFile: Integer;
begin
  Try
    Try
      xls := CreateOleObject('Excel.Application');
      xls.DisplayAlerts := False;
      If StrToFloat(StringReplace(xls.Version, '.', DecimalSeparator, [])) < 12
        then WriteToLog('Error! Requires Excel 2007/2010')
        else for iFile := 0 to slFiles.Count-1 do
                ConvertToXLSB(slFiles[iFile]);
    Finally
      xls.Quit;
      xls := UnAssigned;
    End;
  Except
    on E: Exception do
      WriteToLog(E.Message);
  End;
end;

Где ConvertToXLSB:

Procedure XYZ.ConvertToXLSB(sFileName: String);
Var
  sFileNameTo: String;
begin
  sFileName := ExpandFileName(sFileName);
  sFileNameTo := ChangeFileExt(sFileName, '.xlsb');
  Try
    Try
      xls.Workbooks.Open(sFileName);
      xls.ActiveWorkbook.SaveAs(Filename := sFileNameTo, FileFormat := xlExcel12);
    Finally
      xls.Workbooks.Close;
    End;
  Except
    on E: Exception do
      WriteToLog(E.Message);
  End;
end;

   Думаю, что код простой и комментировать нечего. Остановлюсь только на строке проверки версии MS Excel. xls.Version возвращает номер версии MS Excel в виде строки, где цифры разделены точкой (например, "11.0" для Excel 2003, "12.0" для Excel 2007...), поэтому, чтобы получить номер версии в виде числа его необходимо преобразовать следующим способом:

StrToFloat(StringReplace(xls.Version, '.', DecimalSeparator, []))