![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте. Целый день убил на проблему, истоки которой не могу понять. Есть код, который выводит данные из массива в диапазон ячеек Excel. Так же в коде Delphi я задаю форматирование ячеек. В одном из рядов мне необходимо использовать дробное значение вроде x.xx... Точка или запятая разделяет разряды, мне не важно. В общем, проблема типичная казалось бы, но решение мне в голову не пришло... на моей машине работает всё нормально, у меня Win7 и Excel 2007, но когда дело доходит до Win 2003 Server с его 2003 Excel, происходит что-то невероятное: разделитель дроби игнорируется, и число становится целым... Например, значение 1.83 становится при выводе в Excel числом 183 и так далее. Что я только не пробовал, менял региональные стандарты, ставил и точку и запятую в качестве разделителя, и в самом Excel международные настройки пытался использовать, ничего не помогает, с любым форматом ячеек, кроме текстового разделитель исчезает, текст использовать не могу, так как нужно считать потом данные... Под отладчиком видно, что в массив исходный пишу число с запятой (берётся из базы данных), но установка запятой в качестве разделителя не даёт результатов. Кто может помочь разобраться?
Вот несколько кусков кода моего: 1. Так я заполняю вариантный массив Код:
begin
Result.EmptyFlag := false;
Result.arrCommonData := VarArrayCreate([0, 47 , 0, Params.OraQuery.FieldCount - 4], varVariant);
for i := 0 to VarArrayHighBound(Result.arrCommonData, 1) do
begin
for j := 0 to VarArrayHighBound(Result.arrCommonData, 2) do
if ((j = 43) and (Params.OraQuery.FieldCount = 50 )) or ((j = 33) and (Params.OraQuery.FieldCount = 37)) then
Result.arrCommonData[i,j] := Params.OraQuery.Fields.Fields[j + 3].AsFloat //[j+3] - èñêëþ÷àåì ïîëÿ 'sp.kod, sp_n1, sv.DAY_IN
else
Result.arrCommonData[i,j] := Params.OraQuery.Fields.Fields[j + 3].AsInteger;
Params.OraQuery.Next;
end;
Params.OraQuery.Close;Код:
try
CoInitialize(nil);
Excel := CreateOleObject('Excel.Application');
Excel.DisplayAlerts := false;
Excel.Visible := False;
//Excel.UseSystemSeparators := False;
//Excel.DecimalSeparator := ',';
except
//ShowMessage ('Ïðîáëåìà ïðè çàïóñêå Microsoft Excel: ïðîâåðüòå íàëè÷èå ïðîãðàììû');
end;
if Type_47 then
begin
Excel.workbooks.add(GetCurrentDir() + '\sv_47.xls');
Sheet := Excel.WorkBooks[1].WorkSheets[1];
Sheet.Range['B8:AV55'].Value2 := arrOut;
Sheet.Range['B7:AV55'].NumberFormat :='0;-0;;';
Sheet.Range['AS7:AS55'].NumberFormat :='#,##0;;;'; |
|
#2
|
||||
|
||||
|
ПЧПВГ, вгонять данные в Excel как текст через FloatToStr, a получать обратно через StrToFloat
|
|
#3
|
|||
|
|||
|
Цитата:
а обратно мне вроде как ничего получать не надо... и у меня данные в массиве Variant, FloatToStr тут не катит Пробовал делать так: Код:
for j := 0 to VarArrayHighBound(Result.arrCommonData, 2) do
if ((j = 43) and (Params.OraQuery.FieldCount = 50 )) or ((j = 33) and (Params.OraQuery.FieldCount = 37)) then
Result.arrCommonData[i,j] := Params.OraQuery.Fields.Fields[j + 3].AsString
else
Result.arrCommonData[i,j] := Params.OraQuery.Fields.Fields[j + 3].AsInteger;Последний раз редактировалось M.A.D.M.A.N., 09.02.2015 в 18:59. |
|
#4
|
||||
|
||||
|
Вот кстати вывод данных вариантного массива на примере из drkb
Код:
var
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData : Variant;
TemplateFile : String;
BeginCol, BeginRow, i, j : integer;
RowCount, ColCount : integer;
begin
// Координаты левого верхнего угла области, в которую будем выводить данные
BeginCol := 1;
BeginRow := 5;
// Размеры выводимого массива данных
RowCount := 100;
ColCount := 50;
// Создание Excel
ExcelApp := CreateOleObject('Excel.Application');
// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
ExcelApp.Application.EnableEvents := false;
// Создаем Книгу (Workbook)
// Если заполняем шаблон, то Workbook := ExcelApp.WorkBooks.Add('C:\MyTemplate.xls');
Workbook := ExcelApp.WorkBooks.Add;
// Создаем Вариантный Массив, который заполним выходными данными
ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
// Заполняем массив
for I := 1 to RowCount do
for J := 1 to ColCount do
ArrayData[I, J] := J * 10 + I;
// Левая верхняя ячейка области, в которую будем выводить данные
Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
// Правая нижняя ячейка области, в которую будем выводить данные
Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + RowCount - 1, BeginCol +
ColCount - 1];
// Область, в которую будем выводить данные
Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
// А вот и сам вывод данных
// Намного быстрее поячеечного присвоения
Range.Value := ArrayData;
// Делаем Excel видимым
ExcelApp.Visible := true; |
|
#5
|
|||
|
|||
|
Хех =) спасибо, конечно, но как вывести вариантный массив в Excel я знаю, собственно, у меня так же и есть. Вопрос-то не в этом, вопрос в том, что у меня неправильно на одной (а возможно и не на одной) машине выводятся данные... причём сильно неправильно, это даже погрешностью назвать нельзя, когда 1.83 становится 183, а общая сумма из 43.5 превращается в 1000... Дело не в форматах, все форматы я перепробовал, пробовал вообще без форматов, результат один и тот же
|
|
#6
|
||||
|
||||
|
Оффтоп: Только что проверил этот код с дробным массивом - в 2003 Excel данные выводит правильно
|