Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
125 / 118 / 57
Регистрация: 07.04.2011
Сообщений: 740
1

Обработка Try.Except при загрузке из эксель файла

04.04.2013, 00:40. Просмотров 1369. Ответов 7
Метки нет (Все метки)


Загружаю данные из файла эксель в стринггрид.Код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
function ExcelToStringGrid(AGrid:TStringGrid;OpenExelDlg:TOpenDialog): Boolean;
 const 
    xlCellTypeLastCell = $0000000B; 
 var 
    x, y, k, r: Integer;
    Data,Range:integer;
    Error:Boolean;
    Handle:HWND;
 begin 
    Result := False; 
    // Создаем объект Excel-OLE
    XLApp := CreateOleObject('Excel.Application'); 
    try
      // Спрятать Excel
      XLApp.Visible := False; 
      // Открыть Рабочую книгу
      XLApp.Workbooks.Open(OpenExelDlg.FileName);
      // Лист
      ExSheet := XLApp.Workbooks[1].WorkSheets[1];
     ExSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
      // Получить значение последний строки
      x := XLApp.ActiveCell.Row;
       y:=3; //строка
      // Установить колонку и столбец Stringgrid'а.
      AGrid.RowCount := x;
      // Присвоение Variant ассоциативной WorkSheet'ому значению
     ExRange := XLApp.Range['A1', XLApp.Cells.Item[X, 3]].Value;
      // Установить цикл для заполнения TStringGrid
        for k:=1 to x do
        for r := 1 to 3 do
         begin
          Try
          Data:=StrToInt(EXRange[K,R]);
          except On EConvertError do
           begin
           //  MessageBox(0,'В исходных данных ошибка.Например:буква.Необходимо исправить исходные данные и попытаться загрузить их снова.Исправить ошибку?','Ошибка данных',MB_YESNO)=ID_YES;;
          ShowMessage('Ошибка');
          Exit;
          end;  //except
           end;//try
 
          AGrid.Cells[(r), (k)] := ExRange[K, R]; //переноси в грид данные из экселя
          AGrid.RowCount := k + 1;
        end;
          // Очистка матрицы Delphi Variant
      ExRange := Unassigned;
    finally
      // Выход Excel
      if not VarIsEmpty(XLApp) then 
      begin 
        XLApp.Quit;
        XLAPP := Unassigned;
        ExSheet := Unassigned;
        Result := True;
      end;
       end;
 end;
Файл экселя должен состоять только из целых значений.Без буквенных значений.
Приведенный выше код работает,но он загружает данные из экселя до тех пор,пока не наткнется на неккоректное значение.В грид выведутся значения,до буквы(в вложениях файл,на котором тестирую).
Пробовал проверять весь ExRange до загрузки в стринггрид.Если в нем есть ошибка,то не загружает,но в стринггрид добавляется пустые строки,и их количество равно количеству строк в ExRange.Хотя просто должен прервать выполнение обработки экселя.
ВОПРОС:Как правильно обработать диапазон ExRange до загрузки в стринггрид,чтобы при нахождении в нем ошибок загрузка дальше не происходила.И количество строк в гриде не увеличивалось.Желательно Try..Except.
P.S.Мелочь,но почему-то ругается на MessageBox.А именно на =ID_YES вконце.В чем ошибка?
0
Вложения
Тип файла: xlsx test.xlsx (8.9 Кб, 4 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2013, 00:40
Ответы с готовыми решениями:

Выдает ошибку при загрузке данных из файла эксель на Python 3.7. Что в коде не так?
# Загрузка библиотек import numpy as np import pandas as pd import seaborn as sns import...

Обработка конца строки при загрузке из файла
День добрый. Помогите, пожалуйста. Исходные данные. Есть класс: class ThingPtr { string...

Обработка ошибки при загрузке для парсинга xml файла
помогите пожалуйста как сделать действие чтоб при ошибке загрузки файла по ссылке можно было это...

Обработка ошибки при загрузке для парсинга xml файла
вот код var client = new HttpClient(); var uri = new...

7
125 / 118 / 57
Регистрация: 07.04.2011
Сообщений: 740
04.04.2013, 11:11  [ТС] 2
Никто не знает?Сейчас такая функция осталась.
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function ExcelToStringGrid(AGrid:TStringGrid;OpenExelDlg:TOpenDialog): Boolean;
 const 
    xlCellTypeLastCell = $0000000B; 
 var 
    x, y, k, r: Integer;
    Data,Range:integer;
    Error:Boolean;
    Handle:HWND;
 begin 
    Result := False; 
    // Создаем объект Excel-OLE
    XLApp := CreateOleObject('Excel.Application'); 
    try
      // Спрятать Excel
      XLApp.Visible := False; 
      // Открыть Рабочую книгу
      XLApp.Workbooks.Open(OpenExelDlg.FileName);
      // Лист
     ExSheet := XLApp.Workbooks[1].WorkSheets[1];
     ExSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
      // Получить значение последний строки
      x := XLApp.ActiveCell.Row;
       y:=3; //строка
      // Установить колонку и столбец Stringgrid'а.
      AGrid.RowCount := x;
      // Присвоение Variant ассоциативной WorkSheet'ому значению
     ExRange := XLApp.Range['A1', XLApp.Cells.Item[X, 3]].Value;
      // Установить цикл для заполнения TStringGrid
        for k:=1 to x do
        for r := 1 to 3 do
         begin
          AGrid.Cells[(r), (k)] := ExRange[K, R]; //переносим в грид данные из экселя
          AGrid.RowCount := k + 1;
        end;
          // Очистка матрицы  Variant
      ExRange := Unassigned;
    finally
      // Выход Excel
      if not VarIsEmpty(XLApp) then 
      begin 
        XLApp.Quit;
        XLAPP := Unassigned;
        ExSheet := Unassigned;
        Result := True;
      end;
       end;
 end;

Пробовал при считывании данных из ячеек экселя определять тип данных через VarType(Значение)=VarInteger.Но все равно происходит загрузка,даже если в экселевском файле содержатся буквенные значения.
Может есть еще другие функции определения типа значения?
0
966 / 641 / 97
Регистрация: 01.11.2012
Сообщений: 1,447
04.04.2013, 11:22 3
Создал себе функцию для вычисления формулы через Excel. Отправку, получение и проверку полученных данных из ячейки Excel я делаю так:

Delphi
1
2
3
4
5
6
7
8
9
var Formula_Val:variant
    Formula_Text: string;
begin
...
   MyCell:=Sheet.Cells[1,1];   // определяю ячейку для занесения формулы
   MyCell.Value:=Formula_Text; // Заносим формулу
   Formula_Val:=MyCell.Value;  // Вычисляем формулу
   if (VarIsFloat(Formula_Val)=false) or (VarIsNumeric(Formula_Val)=false) then ShowMessage('Ошибка в формуле')
   else ...
1
125 / 118 / 57
Регистрация: 07.04.2011
Сообщений: 740
04.04.2013, 13:35  [ТС] 4
Не работает...Загружает и буквы,и знаки и прочие некорректные данные.
0
Модератор
3475 / 2599 / 740
Регистрация: 19.09.2012
Сообщений: 7,965
04.04.2013, 13:53 5
Цитата Сообщение от OverDozero Посмотреть сообщение
P.S.Мелочь,но почему-то ругается на MessageBox.А именно на =ID_YES вконце.В чем ошибка?
Код
IDYES
http://docwiki.embarcadero.com... MessageBox
1
125 / 118 / 57
Регистрация: 07.04.2011
Сообщений: 740
04.04.2013, 14:01  [ТС] 6
Да уже разобрался))Спасибо
Просто запрос на закрытие выглядит так:
Delphi
1
2
3
4
5
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);//запрос на выход
begin
  CanClose:=MessageBox(Handle,'Выйти из программы?','Выйти?',MB_YESNO)=ID_YES;
 if CanClose=false then Form1.SetFocus;
 if CanClose=true then halt;
Скопировал этот код,а на него ругается
З.Ы.Проблема с проверкой данных из экселя решена.Проверка идет уже в самом стринггриде,после заполнения данных.
0
2646 / 2269 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
04.04.2013, 14:09 7
Оставь в покое Excel, подключись к документу через ADO, сделай запрос и в цикле по записям/полям возвращенного запросом набора данных контролируй значения:

try
IntValue := ADOQuery.Fields[i].AsInteger;
except
//в ячейке заведомо не целочисленное значение
end;
0
966 / 641 / 97
Регистрация: 01.11.2012
Сообщений: 1,447
04.04.2013, 15:03 8
OverDozero, запрос на выход из программы можно сделать следующий образом:

Delphi
1
2
  if MessageDlg('Вы уверены, что хотите выйти из приложения?',
    mtConfirmation, [mbYes, mbNo], 0) = mrYes then  Close;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2013, 15:03

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Почему при открытии файла эксель, появляется из фонового скрытого режима мой файл эксель
Добрый день уважаемые форумчане, столкнулся с такой проблеммой. Есть небольшая программка которая...

Есть ли у кого нибудь обработка по загрузке из эксель в приходный документ,где поиск происходил бы по штрих-коду?
УТ 10.3 1С 8.1

Обработка исключения при загрузке зависимой сборки
Доброе время суток! Подскажите или пошлите для решения данной задачи. В WinForm проект делаю...

Обработка XML строки при загрузке dbf в Delphi
Пишу программу на Deplhi. программа загружает в себя dbf таблицу с полями: number, type,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.