Доброго времени суток!
Загружаю данные из Excel в StringGrid! Как подсчитать сумму колонок?У меня 24 колонки n кол-во полей, надо каждое значение поля в определенной колонке сложить и потом вывести результат в Excel!
Вот код загрузки из Excel
Код:
procedure SgClear(aSg : TStringGrid);
var
Row : Integer;
begin
//Можно было бы чистить по столбцам - их чаще всего меньше, чем строк,
//но тогда мы стёрли бы надписи в шапке таблицы.
for Row := aSg.FixedRows to aSg.RowCount - 1 do
aSg.Rows[Row].Clear;
aSg.RowCount := aSg.FixedRows + 1;
end;
{Чтение данных с листа рабочей книги MS Excel в таблицу типа TStringGrid.
aRow, aCol - координаты верхней левой ячейки области данных таблицы
на листе MS Excel.}
procedure ExcelToSg(aExSh : Variant; const aRow, aCol : Integer; aSg : TStringGrid);
const
//Идентификатор типа ячейки в диапазоне - последняя (справа внизу) ячейка диапазона.
xlCellTypeLastCell = 11;
var
exRng, exCell1, exCell2 : Variant;
vArr : Variant;
i, j, Row : Integer;
begin
//Очистка StringGrid.
SgClear(aSg);
//Левая верхняя ячейка таблицы.
exCell1 := aExSh.Cells[aRow, aCol];
{Правая нижняя ячейка используемого диапазона на листе.
Используемый диапазон - это прямоугольная область на листе MS Excel, которая
охватывает все используемые ячейки. К используемым ячейкам относятся не только
те ячейки, которые содержат данные, но и те, в которых изменено оформление или
в которых записаны формулы.}
exCell2 := aExSh.UsedRange.SpecialCells(xlCellTypeLastCell);
//Если диапазон, где должны быть данные - пуст, то выходим.
if (exCell2.Row < exCell1.Row) or (exCell2.Column < exCell1.Column) then
Exit;
{Определяем диапазон данных таблицы на листе MS Excel в соответствие
с количеством столбцов в StringGrid.}
exRng := aExSh.Range[exCell1,
exCell1.Offset[exCell2.Row - exCell1.Row, aSg.ColCount - 1]];
//Получаем данные диапазона в виде вариантного массива.
vArr := exRng.Value;
{Задаём количество строк данных (нефиксированных строк) таблицы,
равным количеству строк в диапазоне.}
aSg.RowCount := aSg.FixedRows + VarArrayHighBound(vArr, 1);
//Копирование данных массива в ячейки нефиксированных строк таблицы.
Row := aSg.FixedRows;
for i := 1 to VarArrayHighBound(vArr, 1) do
for j := 1 to VarArrayHighBound(vArr, 2) do
aSg.Cells[j , Row + i ] := vArr[i, j];
end;
procedure TForm8.Button1Click(Sender: TObject);
var
exApp, exBook, exSh : Variant;
Sg : TStringGrid;
Od : TOpenDialog;
begin
StringGrid1.ColCount:=26;
StringGrid1.ColWidths[1]:=100;
StringGrid1.ColWidths[2]:=85;
StringGrid1.ColWidths[3]:=100;
StringGrid1.ColWidths[4]:=85;
StringGrid1.ColWidths[5]:=110;
StringGrid1.ColWidths[6]:=85;
StringGrid1.ColWidths[22]:=85;
StringGrid1.ColWidths[23]:=95;
StringGrid1.ColWidths[24]:=95;
StringGrid1.ColWidths[13]:=85;
Sg := StringGrid1;
Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
if Od.InitialDir = '' then
Od.InitialDir := ExtractFilePath( ParamStr(0) );
if not Od.Execute then Exit;
if not FileExists(Od.FileName) then begin
MessageBox(0, 'Файл с заданным именем не найден. Действие отменено.'
,'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
Exit;
end;
//Попытка подключиться к корневому объекту MS Excel.
try
exApp := CreateOleObject('Excel.Application');
except
MessageBox(0, 'Не удалось запустить MS Excel. Действие отменено.',
'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
Exit;
end;
//Делаем видимым окно MS Excel. На время отладки или на постоянной основе.
exApp.Visible := True;
//Открываем файл рабочей книги.
exBook := exApp.WorkBooks.Open(FileName:=Od.FileName);
//Получаем ссылку на первый лист рабочей книги.
exSh := exBook.Worksheets[1];
{Получаем данные с листа рабочей книги MS Excel и записываем их
в нефиксированные строки таблицы.
Считаем, что левая верхняя ячейка области данных Excel-таблицы имеет координаты: Row = 1, Col = 2.}
ExcelToSg(exSh, 1, 2, Sg);
Подскажите пожалуйста!