Знатоки, подскажите, по какой причине при передаче из Dephi в Excel некоторые символы (табуляция, переносы строк и др.) превращаются в квадратики?
Причём это наблюдается исключительно на Windows XP, на семёрке и десятке всё ОК.
Печать делаю так:
var
Res:TStringList;
begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.DisplayAlerts := false;
ExcelApp.Application.EnableEvents := false;
Workbook := ExcelApp.WorkBooks.Add(extractfiledir(application.ExeName) + '\ResultPrint.xlt'); //шаблон формата Excel 2003
Res:=TStringList.Create;
Res.Text:=connect.QueryExecute('SELECT PACK from ResultPack where RESULT_PACK_ID=' +ResultPackId ).DataSet.FieldByName('PACK').AsString; // запрос возвращает обычную строку, буз всяких квадратиков
...
WorkBook.WorkSheets[1].Cells[1, 1]:=Res.Text; //всё в одну ячейку, ячейка в шаблоне формата "общий"
Workbook.PrintOut;
Квадратики появляются независимо от принтера, если печатать в файл, они тоже есть. Если отображать созданную таблицу Excel - тоже.
Все кириллические шрифты в системе установлены. Ошибка проявляется на любом компьютере с ХР.
Попробуйте безо всяких запросов сделать такую штуку:
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.DisplayAlerts := false;
ExcelApp.Application.EnableEvents := false;
Workbook := ExcelApp.WorkBooks.Add(extractfiledir(application.ExeName) + '\ResultPrint.xlt');
WorkBook.WorkSheets[1].Cells[1, 1]:= 'Hello'#13#10'world';
WorkBook.WorkSheets[1].Cells[1, 2]:= 'Hello'#10'world';
WorkBook.WorkSheets[1].Cells[1, 3]:= 'Hello'#13'world';
WorkBook.WorkSheets[1].Cells[1, 1]:= 'Hello'#10#13'world';
Посмотрите, во всех ли четырёх столбцах будет "квадратик" и если нет - то в каком именно его не будет. От этого будет зависеть решение проблемы (которое будет заключаться в обработке строки через StringReplace, а вот что на что менять надо будет - это и надо понять по результатам эксперимента). Если что, у меня OpenOffice, Excel под рукой нету (и ставить специально для эксперимента особенного желания нет).
Для чего этот эксперимент. Дело в том, что в системе Windows для переноса строки используется не один символ, а два: CR (carriage return, или возврат каретки) и LF (line feed, прогон строки). Формально, нужен только один LF, но исторически ставят именно два. Полагаю, что из базы возвращается последовательность CR+LF, а excel требуется только LF. Мой код позволяет проверить, так ли это. |
|