Перейти к содержимому

Фотография

Работа С Excel


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 Rumata

Rumata

    Новый участник

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 13 сентября 2007 - 06:30

Подскажите как можно извлекать значения из ячеек

Например указываешь диапазон в цикле и он тупо переносит значения из Excel в массив например
  • 0

#2 Bog_dan

Bog_dan

    Новый участник

  • Members
  • Pip
  • 39 сообщений
  • ФИО:Богданов Александр

Отправлено 13 сентября 2007 - 07:06

Вот на скорую руку сделал, может как-то так =)

[codebox] Set ExcelApp = CreateObject("Excel.Application")
pathFile = "C:\..\.xls"
ExcelApp.Workbooks.Open(pathFile)
Set Ran = ExcelApp.Sheets(1).Range("F9:G12")
ReDim arr(Ran.Cells.Count)
For nRow = 1 To Ran.Rows.Count
Set Row = Ran.Rows(nRow)
For nCell = 1 To Row.Cells.Count
arr((nRow - 1) * Row.Cells.Count + nCell - 1) = Row.Cells(nCell).value
Next
Next[/codebox]
  • 0

#3 Rumata

Rumata

    Новый участник

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 13 сентября 2007 - 12:39

Вот на скорую руку сделал, может как-то так =)

Set ExcelApp = CreateObject("Excel.Application")        pathFile = "C:\..\.xls"        ExcelApp.Workbooks.Open(pathFile)        Set Ran = ExcelApp.Sheets(1).Range("F9:G12")        ReDim arr(Ran.Cells.Count)        For nRow = 1 To Ran.Rows.Count                Set Row = Ran.Rows(nRow)                For nCell = 1 To Row.Cells.Count                        arr((nRow - 1) * Row.Cells.Count + nCell - 1) = Row.Cells(nCell).value                Next        Next



я забыл сказать я на delphi

если возможно можно на этом языке

я пытался переделать приведённый код, вот что получилось

var
m : array of string;
ExcelApp, Ran : olevariant;
ExcelApp := CreateObject('Excel.Application');
pathFile := "C:\123.xls';
ExcelApp.Workbooks.Open(pathFile)
Ran := ExcelApp.Sheets(1).Range('F9 : G12');
setlength(m, Ran.Rows.Count) // присваиваю массиву длину
For nRow := 1 To Ran.Rows.Count do
begin
Row := Ran.Rows(nRow);
For nCell := 1 To Row.Cells.Count
m[nRow, nCell] := Row.Cells(nCell).value;
end;


но лезут ошибки массивы он чтоли не понимает на объявлении переменных??
  • 0

#4 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 13 сентября 2007 - 12:58

Здравствуйте.



DelphiScript не поддерживает динамические массивы так, как это делает Delphi. Для работы с динамическими массивами надо использовать методы BuiltIn.CreateVariantArray.



Вот скрипт, который должен заработать у вас:

procedure Test1;
var
  m, ExcelApp, Ran, pathFile, nRow, nCell, Row : olevariant;
begin
  ExcelApp := Sys.OleObject('Excel.Application');
  pathFile := 'C:\123.xlsx';
  ExcelApp.Workbooks.Open(pathFile);
  Ran := ExcelApp.Sheets(1).Range('F9 : G12');
  
  m := BuiltIn.CreateVariantArray2(0, 3, 0, 1); // присваиваю массиву длину
  For nRow := 1 To Ran.Rows.Count do
  begin
	Row := Ran.Rows(nRow);
	For nCell := 1 To Row.Cells.Count do
	  m[nRow - 1, nCell - 1] := Row.Cells(nCell).value;
  end;
  
  ExcelApp.Quit;
end;

  • 0
С уважением,
Дмитрий

#5 D-007

D-007

    Новый участник

  • Members
  • Pip
  • 18 сообщений
  • ФИО:Дамир
  • Город:Казахстан, Астана

Отправлено 15 сентября 2007 - 12:20

Здравствуйте.

Мы используем такой код. Простой и удобный.

MSE:= Sys.OleObject('Excel.Application');
   MSE.Workbooks.Open('C:\PurchaseOrder.xls');
   Log.Message(VarToString(MSE.Cells(i,j).value)); // i и j номер строки и столбца.

  • 0

#6 Rumata

Rumata

    Новый участник

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 17 сентября 2007 - 04:25

Здравствуйте.

Мы используем такой код. Простой и удобный.

MSE:= Sys.OleObject('Excel.Application');
   MSE.Workbooks.Open('C:\PurchaseOrder.xls');
   Log.Message(VarToString(MSE.Cells(i,j).value)); // i и j номер строки и столбца.


Где же ты раньше был? :)
  • 0

#7 gross

gross

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 02 апреля 2008 - 13:09

Здравствуйте.

Мы используем такой код. Простой и удобный.

MSE:= Sys.OleObject('Excel.Application');
   MSE.Workbooks.Open('C:\PurchaseOrder.xls');
   Log.Message(VarToString(MSE.Cells(i,j).value)); // i и j номер строки и столбца.


А как его можно заставить ображаться к Sheet2? Мож кто подскажет?
:victory:
Спасибо.
  • 0

#8 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 02 апреля 2008 - 13:19

А как его можно заставить ображаться к Sheet2? Мож кто подскажет?
:victory:
Спасибо.


как-то так

Sys.OleObject("Excel.Application").Workbooks.Open("Sheet2").Cells(i, j).value
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#9 gross

gross

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 02 апреля 2008 - 14:01

А как его можно заставить ображаться к Sheet2? Мож кто подскажет?
:victory:
Спасибо.


как-то так

Sys.OleObject("Excel.Application").Workbooks.Open("Sheet2").Cells(i, j).value


Разрулил :))
Сенкс.
  • 0

#10 gross

gross

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 02 апреля 2008 - 14:23

А как его можно заставить ображаться к Sheet2? Мож кто подскажет?
:dirol:
Спасибо.


как-то так

Sys.OleObject("Excel.Application").Workbooks.Open("Sheet2").Cells(i, j).value


Получилось что-то типа такого

MsExcel = Sys.OleObject("Excel.Application");

newEx = MsExcel.Workbooks.Open("C:\\data.xls");

ExSheet = MsExcel.activeworkbook.worksheets("Sheet2").Cells(i, j).value;
  • 0

#11 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 03 апреля 2008 - 06:29

А как его можно заставить ображаться к Sheet2? Мож кто подскажет?
:dirol:
Спасибо.


как-то так

Sys.OleObject("Excel.Application").Workbooks.Open("Sheet2").Cells(i, j).value


Получилось что-то типа такого

MsExcel = Sys.OleObject("Excel.Application");

newEx = MsExcel.Workbooks.Open("C:\\data.xls");

ExSheet = MsExcel.activeworkbook.worksheets("Sheet2").Cells(i, j).value;



OleObject - работает оень медлено , я бы советовал испольовать DDT Driver:

function GetDataFromExcel(Path, Sheet,ammonth)	// Достает данные с Еxcel
{																		   //  Path - путь
   var lDriver = DDT["ExcelDriver"](Path, Sheet);	  //  Sheet - лист
   var arrExcelData = new Array();						   //  ammonth - кол-во столбцов
	
   var count=0;
   while (!lDriver["EOF"]())
   {
	 var arrElement = new Array();
	 for (var i=0;i<ammonth;i++)
	  arrElement[i]=lDriver["Value"](i);
	 
	 arrExcelData[count]=arrElement;
	 count++;
	 lDriver["Next"]();
  }
  return arrExcelData;
}

Вот такая вот функция считыват как минимум в 5 раз быстрее данные с Excel чем OleObject
  • 0

#12 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 03 апреля 2008 - 11:38

OleObject - работает оень медлено , я бы советовал испольовать DDT Driver:

function GetDataFromExcel(Path, Sheet,ammonth)	// Достает данные с Еxcel
}

Вот такая вот функция считыват как минимум в 5 раз быстрее данные с Excel чем OleObject


угу, только вот после 26ти обращений к ДДТ драйверу ТестКомплит вылетает с эксепшеном, что-то вроде "не могу создать еще одно подключение". DDT.CloseDriver даже не помогает.

Я тут потихоньку пишу класс для работы с экселем, ну и нагружаю его разными задачами для теста. Так вот, 256 ячеек считывается за 20 секунд. Не так уж и много. Зато более надежно
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#13 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 07 апреля 2008 - 08:36

угу, только вот после 26ти обращений к ДДТ драйверу ТестКомплит вылетает с эксепшеном, что-то вроде "не могу создать еще одно подключение". DDT.CloseDriver даже не помогает.

Я тут потихоньку пишу класс для работы с экселем, ну и нагружаю его разными задачами для теста. Так вот, 256 ячеек считывается за 20 секунд. Не так уж и много. Зато более надежно


Никакких 26-ти раз не встречал

ТС 6.10
Специально попробовал файл 256 строк, 46 столбцов
считал и записал в масив 50! этих файлов - никакого ексепшена все нормально считалось
При чем один файл считывается за 2 секунды!

P.S.
Да вы правильно указали я забыл дописать в верхнюю функцию закрытия драйвера
вот исправляюсь:

//C#Script
function GetDataFromExcel(Path, Sheet,ammonth)	// Достает данные с Еxcel
{																		   //  Path - путь
   var lDriver = DDT["ExcelDriver"](Path, Sheet);	  //  Sheet - лист
   var arrExcelData = new Array();						   //  ammonth - кол-во столбцов
	
   var count=0;
   while (!lDriver["EOF"]())
   {
	 var arrElement = new Array();
	 for (var i=0;i<ammonth;i++)
	  arrElement[i]=lDriver["Value"](i);
	 
	 arrExcelData[count]=arrElement;
	 count++;
	 lDriver["Next"]();
  }
  DDT["CloseDriver"]('lDriver');
  return arrExcelData;
}

P.S.S
А вообще я перещел с Excel на базу,
ADO Driver работает еще в два раза быстрее DDT - и база дает больше возможностей в генерации и использовании тестовых данный :)
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных