Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2015, 21:21   #21
AndrzejX
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 55
По умолчанию

Ругнулся, зла не хватает на добрых людей... Одно понятно: решения нет и не будет. Иначе бы просто дали код. А не пытались отвечать, даже не открывая среду программирования.

Последний раз редактировалось AndrzejX; 06.11.2015 в 21:28.
AndrzejX вне форума Ответить с цитированием
Старый 07.11.2015, 10:37   #22
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Все с тобой понятно.
Откланиваюсь и желаю удачи в поисках.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.11.2015, 12:00   #23
AndrzejX
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 55
По умолчанию

Виноват, виноват... Понимаю. Тем не менее, путём тасования веб-страниц и компилирования всего что увидел, нашёл решение:

Код:
uses ComObj, Variants;


type TRegion = Array of Array of String;

procedure ReadExcelFile(FileName: String; Sheets, ColCount, RowCount: Integer; var Region: TRegion);
var
  Excel, Books, Sheet : OleVariant;
  Matrix : Variant;
  i, j: Integer;
const
  xlCellTypeLastCell = 11;
begin
  Excel := CreateOleObject('Excel.Application');
  Books := Excel.Workbooks.Open(WideString(FileName));
  Sheet := Books.WorkSheets[Sheets];

  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
  Excel.DisplayAlerts:=False;
  Matrix := Excel.Range['A1', Excel.Cells.Item[ColCount, RowCount]].Value;
     for i := 0 to ColCount-1 do
     for j := 0 to RowCount-1 do
       Region[i, j] := Matrix[j+1, i+1];
  Excel.Quit;
end;
Правда, здесь страница указывается порядковым номером, а не именем. Но уже жить можно, а с именем позже разберёмся...
AndrzejX вне форума Ответить с цитированием
Старый 07.11.2015, 12:11   #24
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а не именем.
WorkSheets принимает индекс вариантный. Можешь указывать там название.
https://msdn.microsoft.com/en-us/lib.../ff194464.aspx
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.11.2015, 13:04   #25
AndrzejX
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 55
По умолчанию

Да! Получилось. Таким образом, одна из проблем в кодировке. При передаче строковых параметров нужно преобразовывать:

Код:
var Name: WideString;
begin
  Name:=WideString(FileName);
end;
Хм... При попытке чтения "боевого" файла вместо тестового выскочила очередная ошибка на строке

Sheet.Cells.SpecialCells(xlCellType LastCell, EmptyParam).Activate;

Закомментировал. Работает! Как в тестовом (формат .xlsx) так и в рабочем (формат .xls) файле. Значит эта строка лишняя. И в непонятной константе

const xlCellTypeLastCell = 11;

нет необходимости.

Одна проблема пока остаётся. Кириллические символы ни в имени, ни в тексте файла не допускаются.

Избыточными оказались также

uses Variants;

и

Excel, Books, Sheet : {Ole}Variant;

Таким образом, окончательный вариант процедуры для чтения региона ColCount столбцов RowCount строк выглядит так:

Код:
uses ComObj;

type TRegion = Array of Array of String;

procedure ReadExcelFile(FileName, SheetName: String; ColCount, RowCount: Integer; var Region: TRegion);
var
  Excel, Books, Sheet, Matrix : Variant;
  i, j: Integer;
begin
  Excel := CreateOleObject('Excel.Application');
  Books := Excel.Workbooks.Open(WideString(FileName));
  Sheet := Books.WorkSheets[WideString(SheetName)];

  Excel.DisplayAlerts:=False;
  Matrix := Excel.Range['A1', Excel.Cells.Item[ColCount, RowCount]].Value;
  for i := 0 to ColCount-1 do
  for j := 0 to RowCount-1 do
    Region[i, j] := Matrix[j+1, i+1];
  Excel.Quit;
end;

Последний раз редактировалось Stilet; 07.11.2015 в 14:17.
AndrzejX вне форума Ответить с цитированием
Старый 07.11.2015, 14:19   #26
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Excel := CreateOleObject('Excel.Application' );
Books := Excel.Workbooks.Open(WideString(Fil eName));
Sheet := Books.WorkSheets[WideString(SheetName)];
Зря ты проверок не делаешь.
Цитата:
Excel.Quit;
Не мешало бы еше сам интерфейс освобождать обNILением или через unassigned.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2015, 10:50   #27
AndrzejX
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 55
По умолчанию

Было дело, я тут на форуме несколько лет назад даже вопрос задавал, почему после Excel.Quit сам процесс Excel не закрывается, ответ - требуется Excel.Unassigned. Но тут вижу что Excel.Quit достаточно - в списке процессов процесс Excel больше не присутствует. Что, почему, неясно, но факт. А насчёт проверок, то конечно, лучше всё заключить в try/finally.

А заглянул я сюда в эту тему для ещё небольшого уточнения процедуры чтения. Оказывается, объект Matrix обязан быть квадратным! При попытке чтения произвольного, не квадратного региона происходит ошибка. Поэтому нужно использовать максимальное значение из ColCount и RowCount. При этом, массив Region не обязан быть квадратным. Ну, вот так примерно:

Код:
type TRegion = Array of Array of String;

procedure ReadExcelFile(FileName, SheetName: String; ColCount, RowCount: Integer; var Region: TRegion);
var
  Excel, Books, Sheet, Matrix : Variant;
  i, j, n: Integer;
begin
 try
  Excel := CreateOleObject('Excel.Application');
  Books := Excel.Workbooks.Open(WideString(FileName));
  Sheet := Books.WorkSheets[WideString(SheetName)];
  SetLength(Region, ColCount, RowCount);

  Excel.DisplayAlerts:=False;
  if ColCount > RowCount
    then n:=ColCount
    else n:=RowCount;
  Matrix := Excel.Range['A1', Excel.Cells.Item[n, n]].Value;
     for i := 0 to ColCount-1 do
     for j := 0 to RowCount-1 do
       Region[i, j] := Matrix[j+1, i+1];
 finally
  Excel.Quit;
//  Excel.Unassigned;
 end;
end;

Последний раз редактировалось AndrzejX; 11.11.2015 в 11:04.
AndrzejX вне форума Ответить с цитированием
Старый 11.11.2015, 13:19   #28
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Попробуйте fpSpreadSheet, в отличие от OLE это кросс-платформенный вариант и будет работать без наличия Excel со скоростью даже не сопоставимой при использовании OLE. Работает только с форматом Excel 97-2003. Не знаю кому как, но мне fpSpreadSheet полностью покрывает все нужды для экспорта-импорта информации.
Rik вне форума Ответить с цитированием
Старый 16.11.2015, 10:39   #29
AndrzejX
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 55
По умолчанию

Ну вот пытаюсь узнать в Гугле что-то про то как установить fpSpreadSheet. Результат - найдено "ошибка при установке такая-то", "ошибка ещё другая" и тому подобное. Конкретной информации "НОЛЬ". Да и сама Wiki содержит такое количество оговорок про то что "то не реализовано, здесь будут ошибки" и так далее, что читать и использовать становится страшновато.

Последний раз редактировалось AndrzejX; 16.11.2015 в 10:43.
AndrzejX вне форума Ответить с цитированием
Старый 17.11.2015, 10:48   #30
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от AndrzejX Посмотреть сообщение
Ну вот пытаюсь узнать в Гугле что-то про то как установить fpSpreadSheet. Результат - найдено "ошибка при установке такая-то", "ошибка ещё другая" и тому подобное. Конкретной информации "НОЛЬ". Да и сама Wiki содержит такое количество оговорок про то что "то не реализовано, здесь будут ошибки" и так далее, что читать и использовать становится страшновато.
Я использую последнюю оригинальную версию Lazarus 1.4.4 и fpc 2.6.4, fpSpreadSheet на Linux и Windows ставится и работает отлично (хотя были случаи, что после установки свежей версии из svn некоторые функции отваливались, т.к. проект находится все время в процессе разработки и в случае ошибки можно откатиться на предыдущую версию и немного подождать, пока исправят неработающие функции).
Сам fpSpreadSheet я беру по той ссылке, что указана здесь, в разделе скачать: http://wiki.freepascal.org/FPSpreadsheet/ru
Я использую вот эту, по ней доступна версия 1.7 на SourceForge лежит 1.6:
Цитата:
svn co https://lazarus-ccr.svn.sourceforge..../fpspreadsheet fpspreadsheet
На Linux svn клиент встроен, во всяком случае я ничего не устанавливал, svn работает, на Windows видимо нужно установить subversion.
Разобраться с компонентами в общем-то труда не составляет, есть примеры, да и по именам функций можно понять что они делают. Работа с компонентами напоминает работу через OLE, создаем книгу, добавляем лист, через лист обращаемся к его ячейкам,пишем в них что нужно, обрисовываем, объединяем и т.д., затем сохраняем книгу. Для чтения XLS создаем книгу, загружаем содержимое из XLS документа, обращаемся к нужному листу, затем в ячейки листа читаем или пишем что нужно.

Сам проект fpSpreadSheet содержит 3 пакета:
laz_fpspreadsheet - это не визуальные компоненты, как раз те, что нужны для экспорта импорта для замены OLE, их устанавливать не нужно, там нет процедуры register, которая регистрирует компоненты в системе, этот пакет нужно просто скомпилировать.
Второй пакет laz_fpspreadsheet_visual содержит визуальные компоненты (сетку и т.д.) с помощью которых можно организовать подобие Excel в своей программе. Можете его установить, если есть желание. После установки в Lazarus на панели появится закладка FPSpreadSheet.
И третий пакет laz_fpspreadsheetexport_visual - содержит не визуальные компоненты для экспорта в CSV, RTF, XML, JSON и т.д. про него ни чего не могу сказать, я им не пользовался и он видимо появился недавно.

Попробовал прямо сейчас скачать самую последнюю версию из svn, в Lazarus 1.4.4 все скомпилировалось замечательно без ошибок.

Если Вы сомневаетесь в функционале, в любом случае, пока не попробуете не узнаете. Я рекомендую fpSpreadSheet обязательно попробовать. Единственное с чем есть проблема - это формулы, но лично мне они не нужны.

Последний раз редактировалось Rik; 17.11.2015 в 20:36.
Rik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lazarus в Linux - Поиск файлов в папке BLACK_RAIN Lazarus, Free Pascal, CodeTyphon 4 08.10.2014 11:23
Обработка файлов(lazarus). Chelovekpredel Lazarus, Free Pascal, CodeTyphon 2 23.09.2012 12:14
Чтение и запись больших excel файлов на c# Bi0max C# (си шарп) 0 21.08.2012 20:33
Lazarus подключение .so, .dll файлов Diez_ Lazarus, Free Pascal, CodeTyphon 19 07.07.2011 21:23
Открытие html-файлов в Lazarus student2008 Lazarus, Free Pascal, CodeTyphon 2 25.12.2010 11:07