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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2013, 23:37   #1
Євгеній Бєлік
Пользователь
 
Аватар для Євгеній Бєлік
 
Регистрация: 29.10.2011
Сообщений: 52
По умолчанию Excel to StringGrid and StringGrid to Exel

Добрый вечер!
Возникла такая проблема:
у меня есть таблица в екселе размерностью 122 (столбца) на 5070 (строк) (этот диапазон я указываю вручную, просто там есть еще данные которые мне не нужны).
Так вот, когда я считываю этот диапазон то вылетает такая ошибка: OLE error 800A03EC, потом делаю пару операций с ней и записываю в новою таблицу и тоже при записи выдает ошибку!

Вот запись в табл:
Код:
procedure Xls_Open(XLSFile:string; Grid:TStringGrid; rMax:integer; cMax:integer);
  const
   xlCellTypeLastCell = $0000000B;
var
   ExlApp, Sheet: OLEVariant;
   i, j:integer;

begin
   //создаем объект Excel
   ExlApp := CreateOleObject('Excel.Application');

   //делаем окно Excel невидимым
   ExlApp.Visible := false;

   //открываем файл XLSFile
   ExlApp.Workbooks.Open(XLSFile);

   //создаем объект Sheet(страница) и указываем номер листа (1)
  //в книге, с которого будем осуществлять чтение
   Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

  //активируем последнюю ячейку на листе
   Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    // Возвращает номер последней строки
     //r := ExlApp.ActiveCell.Row;

    // Возвращает номер последнего столбца
     //c := ExlApp.ActiveCell.Column;

    //устанавливаем кол-во столбцов и строк в StringGrid
     Grid.RowCount:=rMax;
     Grid.ColCount:=cMax;

    //считываем значение из каждой ячейки и копируем в нашу таблицу
      for j:= 1 to rMax do
        for i:= 1 to cMax do
          Grid.Cells[i-1,j-1]:= sheet.cells[j,i];
         //если необходимо прочитать формулы то
        //Grid.Cells[i-1,j-1]:= sheet.cells[j,i].formula;

 //закрываем приложение Excel
  ExlApp.Quit;

  //очищаем выделенную память
  ExlApp := Unassigned;
  Sheet := Unassigned;

end;
Ошибка выдает на строке:
Код:
Grid.Cells[i-1,j-1]:= sheet.cells[j,i];
А вот сохранение:
Код:
function RefToCell(ARow, ACol: Integer): string;
 begin
   Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow);
 end;

 function SaveAsExcelFile(AGrid: TStringGrid; ASheetName, AFileName: string): Boolean;
 const
   xlWBATWorksheet = -4167;
 var
   Row, Col: Integer;
   GridPrevFile: string;
   XLApp, Sheet, Data: OLEVariant;
   i, j: Integer;
 begin
   // Prepare Data
  Data := VarArrayCreate([1, AGrid.RowCount, 1, AGrid.ColCount], varVariant);
   for i := 0 to AGrid.ColCount - 1 do
     for j := 0 to AGrid.RowCount - 1 do
       Data[j + 1, i + 1] := AGrid.Cells[i, j];
   // Create Excel-OLE Object
  Result := False;
   XLApp := CreateOleObject('Excel.Application');
   try
     // Hide Excel
    XLApp.Visible := False;
     // Add new Workbook
    XLApp.Workbooks.Add(xlWBatWorkSheet);
     Sheet := XLApp.Workbooks[1].WorkSheets[1];
     Sheet.Name := ASheetName;
     // Fill up the sheet
Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount, AGrid.ColCount)].Value := Data;
     // Save Excel Worksheet
    try
       XLApp.Workbooks[1].SaveAs(AFileName);
       Result := True;
     except
       // Error ?
    end;
   finally
     // Quit Excel
    if not VarIsEmpty(XLApp) then
     begin
       XLApp.DisplayAlerts := False;
       XLApp.Quit;
       XLAPP := Unassigned;
       Sheet := Unassigned;
     end;
   end;
 end;
Ошибка на строке:
Код:
Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount, AGrid.ColCount)].Value := Data;
Помогите пожалуйста!
Євгеній Бєлік вне форума Ответить с цитированием
Старый 24.11.2013, 00:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
Grid.Cells[i-1,j-1]:= sheet.cells[j,i].value;
не?
Цитата:
Ошибка на строке:
Какая? Или текст нам угадывать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.11.2013, 00:13   #3
Євгеній Бєлік
Пользователь
 
Аватар для Євгеній Бєлік
 
Регистрация: 29.10.2011
Сообщений: 52
По умолчанию

когда пошол процесс записи в сринггрид тога выдает ошибку: OLE error 800A03EC, после того как я нажимаю брейк тогда просто мне указывает на эту строку, такая же ситуация с сохранением...
Если поможет то внизу программной среды написано:
First chance exception at $75D1812F. Exception class EOleException with message 'OLE error 800A03EC'. Process Project1.exe (30400)
Євгеній Бєлік вне форума Ответить с цитированием
Старый 24.11.2013, 00:20   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я не пойму что эта строка делает у тебя. Почему не идти через свойство cell?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c Excel в StringGrid SPD Общие вопросы Delphi 3 21.11.2011 14:31
stringgrid+колесо мыши=>stringgrid.onclick aalleexxaa Общие вопросы Delphi 5 16.02.2011 16:58
StringGrid и MS Excel ChEaTeR-abc Помощь студентам 1 05.07.2010 09:04
Как сделать в таблице (StringGrid) ячейку состоящую из двух ячеек на манер Exel бедный_студент Помощь студентам 3 28.04.2009 01:15
Excel и StringGrid apx_angel Компоненты Delphi 2 20.02.2007 00:20