Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2013, 14:28   #1
fcdk_pavel
 
Регистрация: 13.09.2013
Сообщений: 8
По умолчанию Из excel в delphi и просуммировать столбцы

Доброго времени суток!
Загружаю данные из 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);
Подскажите пожалуйста!
fcdk_pavel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сравнить столбцы с разными количествами строк в EXCEL 2007 ? lutdan Microsoft Office Excel 10 11.02.2013 10:16
просуммировать время fobass Общие вопросы Delphi 10 21.09.2012 13:04
матрица размером NxM. Упорядочить ее столбцы по невозрастанию их наибольших элементов (в Delphi) virgin_sova Помощь студентам 0 28.06.2011 22:22
Delphi. упорядочить столбцы матрицы по возрастанию сумм элементов этого столбца ДваДваВо7 Помощь студентам 2 09.02.2011 16:40