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

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

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

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

Сообщение Владимир » 27.04.2013 08:10:03

Gampos писал(а):На выходе в ксв получается (кракозябры).

Молодой человек, изъясняйтесь понятнее - на форуме экстрасенсы не каждый раз присутствуют. Что есть "ксв"? И какую технологию экспорта вы используете - от Rik (даже не смотрел) или через OLE, как в моем примере?
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Gampos » 27.04.2013 10:15:52

Владимир, я использую код, который посоветовали Вы - StringGrid1.SaveToFile('C:\Lazarus\grid1.csv'). потом открываю этот документ с помощью excel и вместо русских букв вижу Дата в„– колект Нач.смены Смена Р СѓРґР°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
можно ли при сохранении в коде лазаруса отразить как-то кодировку, чтобы русские буквы потом в екселе нормально отображались???помогите, пожалуйста... Заранее спасибо)
Аватара пользователя
Gampos
новенький
 
Сообщения: 17
Зарегистрирован: 25.04.2013 08:24:40
Откуда: Владивосток

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

Сообщение Владимир » 27.04.2013 10:45:57

Gampos писал(а): который посоветовали Вы - StringGrid1.SaveToFile('C:\Lazarus\grid1.csv').

1. Сохранение в файл .csv посоветовал не я, а уважаемый vada. Перед сохранением следует пройти в цикле по всем ячейкам с преобразованием UTF - ansi
Код: Выделить всё
for i:=0 to StringGrid.RowCount-1 do
for j:=0 to StringGrid.ColCount-1 do
StringGrid.Cells[i,j]:=Utf8ToAnsi( StringGrid.Cells[i,j]);
//не исключено, что придется ввести переменную WideString и действовать через нее
var
s:WideString;
begin
for i ....
  for j .... do begin
s:=StringGrid.Cells[i,j];
StringGrid.Cells[i,j]:=Utf8ToAnsi(s);
end;
end;

2. А мой последний код через OLE не стал пробовать? Там точно такое же преобразование. Этот путь правильнее, т.к. позволяет выполнить форматирование Excel-таблицы и сразу ее показать.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Gampos » 27.04.2013 11:02:04

Ваш код я попробовал, но я не могу понять как вместо 'текст' вставить данные из своего стринг грида...в данный момент у меня с помощью Вашего кода по нажатию кнопки открывается книга екселя с заголовком текст....а вот как мне сделать так чтобы отобразились там данные из моего стринг грида до меня не доходят..Подскажите, пожалуйста..Буду благодарен..
Аватара пользователя
Gampos
новенький
 
Сообщения: 17
Зарегистрирован: 25.04.2013 08:24:40
Откуда: Владивосток

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

Сообщение Владимир » 27.04.2013 11:22:01

Gampos писал(а):Ваш код я попробовал, но я не могу понять как вместо 'текст' вставить данные из своего стринг грида...в данный момент у меня с помощью Вашего кода по нажатию кнопки открывается книга екселя с заголовком текст....а вот как мне сделать так чтобы отобразились там данные из моего стринг грида до меня не доходят..Подскажите, пожалуйста..Буду благодарен..

У моей жены во Владивостоке живет дядя - помогаю только поэтому! (шутка).
Все просто.
Код: Выделить всё
StringGrid.Cells[col,row] - это содержимое ячейки [колонка - строка], тип String, нумерация строк и колонок начинается с 0 !!!!!
Sheet.Cells(row,col) - это ячейка Excel - [строка - колонка], тип String, нумерация строк и колонок начинается с 1 !!!!! 
// делаешь двойной цикл
var
s:WideString;
i,j:Integer;
begin
for i:=0 to StringGrid.RowCount-1 do
  for j:=0 to StringGrid.ColCount-1 do begin
s:=StringGrid.Cells[j,i];
Sheet.Cells(i+1,j+1):=Utf8ToAnsi(s);
end;
end;
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Gampos » 27.04.2013 11:40:26

я видимо совсем тупой, но даже сейчас, когда я использовал Ваш код у меня выдает ошибку "проект project1 вызвал класс исключения 'EVariantInvalidOpError' с сообщением Invalid variant operation
код баттона, отвечающего за экспорт
procedure TForm1.Button25Click(Sender: TObject);

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

begin
for i:=0 to StringGrid1.RowCount-1 do
for j:=0 to StringGrid1.ColCount-1 do
begin
s:=StringGrid1.Cells[j,i];
Sheet.Cells(i+1,j+1):=Utf8ToAnsi (s);
end;
{ exl:=CreateOleObject('Excel.Application');
WorkBook:=exl.Application.WorkBooks.Add;
Sheet:=exl.WorkBooks[1].Sheets[1];
Currow:=1;

str:=Utf8ToAnsi ('Текст');

sheet.cells(Currow,3):=str;
exl.visible:=true;
exl.application.activeWorkBook.Save; }
end;
Аватара пользователя
Gampos
новенький
 
Сообщения: 17
Зарегистрирован: 25.04.2013 08:24:40
Откуда: Владивосток

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

Сообщение Владимир » 27.04.2013 11:51:36

Gampos писал(а):я видимо совсем тупой

1. Оформляй свой код внутри тэга (кнопочка Code), народ не поймет.
2. Внимательно смотри свой код - зачем закомментировал создание и показ книги? И что делаем сначала, а что потом?
Код: Выделить всё
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:=StringGrid1.Cells[j,i];
Sheet.Cells(i+1,j+1):=Utf8ToAnsi (s);
end;
//показываем
exl.visible:=true;
exl.application.activeWorkBook.Save;
end;
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Gampos » 27.04.2013 12:07:28

Владимир, сделал все как ты написал, ексель открылася, данные туда перенеслись, но русские буквы отразились иероглифами -  ₹ ⻷û à 湚 扐 嫵n 僵b 훭湚 훭扐 훭敆 퇭嫢n 퇭僢b 嫢n 僢b 죦㇧ 죦㋧ 죦쫧⯫ㄳ5 湚 扐 Ï
㜲〮⸴〲㌱ ? äà å ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5 ⰵ5
Аватара пользователя
Gampos
новенький
 
Сообщения: 17
Зарегистрирован: 25.04.2013 08:24:40
Откуда: Владивосток

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

Сообщение Владимир » 27.04.2013 12:18:09

Gampos писал(а):сделал все как ты написал

Мы уже на ты? Ну-ну. Судя по всему, я много старше...
1. Надо понять, откуда берутся данные в твоем Grid - в какой кодировке?
2. Экспериментируй. Попробуй убрать Utf8ToAnsi и посмотреть результат.
Попробуй Utf8ToSys, Utf8Tocp1251, гугл в помошь!
Последний раз редактировалось Владимир 27.04.2013 12:24:26, всего редактировалось 1 раз.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Gampos » 27.04.2013 12:22:25

Простите, я видимо просто задумался когда писал....данные в StringGride берутся из Dbf, отображаются в гриде по русски корректно, а вот после экспорта в ексель происходит вот так вот... эксперментировал, если убрать Utf8ToAnsi, получаются Дата в„– колект Нач.смены Смена Р СѓРґР°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
Посоветуете что-нибудь?
Аватара пользователя
Gampos
новенький
 
Сообщения: 17
Зарегистрирован: 25.04.2013 08:24:40
Откуда: Владивосток

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

Сообщение Владимир » 27.04.2013 12:35:29

Gampos писал(а):Простите

Принимается.
Попробуй сначала пройтись по Grid с преобразованием

Код: Выделить всё
Grid.Cells[i,j]:=SysToUtf8(Grid.Cells[i,j]);

Возможные варианты кодировки .dbf : OEM, cp1251 (вроде бы). Нельзя ли понять системную кодировку, где формировался твой .dbf ? Поищи здесь на форуме по кодировкам инфы бездна!
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Gampos » 27.04.2013 12:42:54

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

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

Сообщение Владимир » 27.04.2013 12:47:57

Gampos писал(а):если у меня получится,

Без если: имей в виду, что твое найденное решение может быть полезно еще кому-то, поэтому делиться надо обязательно!
И кстати - почаще жми Ctrl Alt Del - смотри в процессах "лишние" тобой созданные процессы Excel - убивай беспощадно!
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Gampos » 27.04.2013 13:11:54

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

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

Сообщение Владимир » 27.04.2013 13:35:04

Gampos писал(а):решение с помощью нотпада

NotePad - это не наш метод!
Вернись немного назад - сохрани Grid в .csv (без преобразования utf8ToAnsi) и открой в Excel - он должен показать текущую кодировку, отсюда и пляши. То, что в Grid показаны нормальные буквы - это Лазарус на лету перекодировал, на самом деле там что-то другое. Можно пробовать OEMtoUtf8, cp1251ToUtf8 и т.д., не исключено, что придется делать двойное преобразование - сначала содержимое ячеек Grid в UTF8, а затем уже UTF8 в Ansi для вывода в Excel.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 12

Рейтинг@Mail.ru