StringGrid экспорт данных Excel

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

waydm
незнакомец
Сообщения: 3
Зарегистрирован: 27.04.2013 14:03:18
Откуда: Саратов

Сообщение waydm »

Извиняюсь, что прямо с первого сообщения вмешиваюсь.
Есть самодельный модуль XLSX, который делает то, что вам, Gampos, нужно.
Сохранить StringGrid1 в файл Excel можно как-то так:

Код: Выделить всё

procedure TForm1.BtnCopyFromGridClick(Sender: TObject);
var
  WB: TWorkBook;
  WS: TWorkSheet;
begin
  WB:= TWorkBook.Create;
  WS:=WB.AddWorkSheet;
  WS.LoadFromStringGrid(StringGrid1);
  WB.SaveToFile('Filename.xlsx');
  WB.Free;
end;

TWorkBook, TWorkSheet - объявлены в модуле.
Наличия в системе установленного MS Office не требуется.
(сохранить можно только в файл xlsx)

Если интересно, могу выслать исходник.
Аватара пользователя
Gampos
новенький
Сообщения: 17
Зарегистрирован: 25.04.2013 08:24:40
Откуда: Владивосток
Контактная информация:

Сообщение Gampos »

Попробовал сохранить Grid в .csv , выдал кодировку ANSI as UTF-8....теперь буду пробовать менять кодировку в гриде.. посмотрю что получится...Обзательно отпишусь..

Добавлено спустя 5 минут 53 секунды:
waydm , конечно интересно.. если Вам не сложно был бы рад исходнику))
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Gampos писал(а):был бы рад исходнику

Добавлять чужие модули в свой проект можно, если нет другого выхода и если понимаешь, что и как в нем делается. Старайся по возможности использовать штатные средства Лазаруса. Кроме того, не уверен, что в модуле waydm автоматом будет преобразование кодировок (могу ошибаться).
Ты в двух шагах от результата! Должно получиться - сначала Grid в UTF8, затем - в ansi.
waydm
незнакомец
Сообщения: 3
Зарегистрирован: 27.04.2013 14:03:18
Откуда: Саратов

Сообщение waydm »

Gampos, ок, скиньте в личку свою почту.
Владимир, все от начала до конца в UTF-8, ничего преобразовывать не требуется.
А на счет приоритетного использования штатных средств - вы безусловно правы. Но, иногда, все же приходится отступать от этого правила.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

waydm писал(а): все от начала до конца в UTF-8


Добавлено спустя 15 часов 46 минут 26 секунд:
Gampos писал(а):буду пробовать менять кодировку
Последний раз редактировалось Владимир 29.04.2013 21:32:23, всего редактировалось 1 раз.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

Gampos писал(а):Спасибо *Rik* , первоклассный исходник, наглядно показано,
Попробовал от Владимира код импортировать, превосходно выходит. Спасибо.

Не сочтите за наглость, но можете посоветовать, как правильно указать кодировку, при экспорте данных из стринг грид (версия лазаруса 1.0. 8 ).
На выходе в ксв получается (кракозябры). Если потом импортировать в ексель, с указанием уникод УТФ8, буквы становятся нормальными.
Можно ли при экспорте в ксв принудительно задать эту кодировку?

Код: Выделить всё

 Р”ата   в„– колект   РќР°С‡.смены   РЎРјРµРЅР°   Р СѓРґР°Zn   Р СѓРґР°Pb   РҐРІРўРµС…Zn   РҐРІРўРµС…Pb   РљРѕРЅР¦РёРЅZn   РљРѕРЅР¦РёРЅPb   РљРѕРЅР¦РёРЅFe   РљРѕРЅРЎРІZn   РљРѕРЅРЎРІPb   РҐРІРўРѕРІZn   РҐРІРўРѕРІPb   Р РµР¶Р˜Р·1СЃС‚   Р РµР¶Р˜Р·2СЃС‚   Р РµР¶Р˜Р·РљР»+315   Р’Р»Zn   Р’Р»Pb   РџСЂРёРјРµС‡Р°РЅРёРµ
27.04.2013   РІС‚?   РњСѓРґСЂРµС†РѕРІР°   РґРЅРµ   5,5   5,5   5,5   5,5   5,5   5,5   5,5   5,5   5,5   5,5   5,5   5,5   5,5   5,5   5,5   5,5   
 


Запрещено файлы передавать, - содержимое ксв файла.


UTF8Decode('строка')????
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

А Excel какой версии? 2010-ый хранит строки в кодировке UTF-8.
Аватара пользователя
Gampos
новенький
Сообщения: 17
Зарегистрирован: 25.04.2013 08:24:40
Откуда: Владивосток
Контактная информация:

Сообщение Gampos »

Долго колдовал над кодировками, наконец-то получилось:)))) делюсь кодом, который экспортирует данные из стринг грида в ексель с нормальными буквами, без всяких кроказябр.....

Код: Выделить всё

procedure TForm1.Button24Click(Sender: TObject);

 var str,s:WideString;
      exl:OleVariant;
      i,j:integer;

     begin
      exl:=CreateOleObject('Excel.Application');
      WorkBook:=exl.Application.WorkBooks.Add;
      Sheet:=exl.WorkBooks[1].Sheets[1];
      for i:=0 to StringGrid1.RowCount-1 do
      for j:=0 to StringGrid1.ColCount-1 do
      begin
      s:=UTF8ToAnsi(StringGrid1.Cells[j,i]);
          Sheet.Cells(i+1,j+1):= (s);
      end;
     exl.visible:=true;
       exl.application.activeWorkBook.Save;


Спасибо огромное еще раз всем за помощь)))
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Gampos писал(а):без всяких кроказябр

Что-то не так.

Код: Выделить всё

var
s:WideString;
....................
//это работает
s:=UTF8ToAnsi(StringGrid1.Cells[j,i]);
Sheet.Cells(i+1,j+1):= (s);//зачем здесь скобки?

//это не работает
s:=StringGrid1.Cells[j,i];
Sheet.Cells(i+1,j+1):=UTF8ToAnsi(s);

Кто-нидь объяснит?
Аватара пользователя
amateur
энтузиаст
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Сообщение amateur »

Ужасная идея завязываться на оле (сугубо личное).

Почему не воспользоваться готовым, вполне рабочим FPSpreadsheet. Там ведь все в комплекте, вплоть до того в какую версию экселя выводить. Единственное чем не понравился - "тугая" работа опенофисом.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Скобки лишние.
Здесь проблема в преобразовании типов между String и WideString.
Пробуйте так:

Код: Выделить всё

Sheet.Cells(i+1,j+1):=WideString(UTF8ToAnsi(s));
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Mr.Smart писал(а):Здесь проблема в преобразовании типов между String и WideString.

Где-то здесь на форуме проскочило, что UTF8ToAnsi работает только с WideString (для кириллицы). Как умная Маша, пишу

Код: Выделить всё

var
s:WideString;
...............
s:='Текст';
Sheet.Cells[1,1]:=UTF8ToAnsi(s);

В Excel получаю нормально "Текст"
Делаю то же с ячейками StringGrid - получаю бред.
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

Mr.Smart писал(а):Скобки лишние.
Здесь проблема в преобразовании типов между String и WideString.
Пробуйте так:

Код: Выделить всё

Sheet.Cells(i+1,j+1):=WideString(UTF8ToAnsi(s));


Спасибо!
Вы спасли моё положение :)
Всё работает, как надо!
Ответить