Gampos писал(а):На выходе в ксв получается (кракозябры).
Молодой человек, изъясняйтесь понятнее - на форуме экстрасенсы не каждый раз присутствуют. Что есть "ксв"? И какую технологию экспорта вы используете - от Rik (даже не смотрел) или через OLE, как в моем примере?
Владимир, я использую код, который посоветовали Вы - 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 можно ли при сохранении в коде лазаруса отразить как-то кодировку, чтобы русские буквы потом в екселе нормально отображались???помогите, пожалуйста... Заранее спасибо)
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-таблицы и сразу ее показать.
Ваш код я попробовал, но я не могу понять как вместо 'текст' вставить данные из своего стринг грида...в данный момент у меня с помощью Вашего кода по нажатию кнопки открывается книга екселя с заголовком текст....а вот как мне сделать так чтобы отобразились там данные из моего стринг грида до меня не доходят..Подскажите, пожалуйста..Буду благодарен..
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;
я видимо совсем тупой, но даже сейчас, когда я использовал Ваш код у меня выдает ошибку "проект 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;
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;
Мы уже на ты? Ну-ну. Судя по всему, я много старше... 1. Надо понять, откуда берутся данные в твоем Grid - в какой кодировке? 2. Экспериментируй. Попробуй убрать Utf8ToAnsi и посмотреть результат. Попробуй Utf8ToSys, Utf8Tocp1251, гугл в помошь!
Последний раз редактировалось Владимир 27.04.2013 12:24:26, всего редактировалось 1 раз.
Простите, я видимо просто задумался когда писал....данные в 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 Посоветуете что-нибудь?
Возможные варианты кодировки .dbf : OEM, cp1251 (вроде бы). Нельзя ли понять системную кодировку, где формировался твой .dbf ? Поищи здесь на форуме по кодировкам инфы бездна!
Без если: имей в виду, что твое найденное решение может быть полезно еще кому-то, поэтому делиться надо обязательно! И кстати - почаще жми Ctrl Alt Del - смотри в процессах "лишние" тобой созданные процессы Excel - убивай беспощадно!
Конечно.. как только у меня получится, я поделюсь кодом... пока в интернете нашел только решение с помощью нотпада переделывать екселевский файл в чистый UTF-8, а потом открывать в екселе, в статье написано что должно работать, но иероглифы у меня прежние...
NotePad - это не наш метод! Вернись немного назад - сохрани Grid в .csv (без преобразования utf8ToAnsi) и открой в Excel - он должен показать текущую кодировку, отсюда и пляши. То, что в Grid показаны нормальные буквы - это Лазарус на лету перекодировал, на самом деле там что-то другое. Можно пробовать OEMtoUtf8, cp1251ToUtf8 и т.д., не исключено, что придется делать двойное преобразование - сначала содержимое ячеек Grid в UTF8, а затем уже UTF8 в Ansi для вывода в Excel.