Работа С Excel
#1
Отправлено 13 сентября 2007 - 06:30
Например указываешь диапазон в цикле и он тупо переносит значения из Excel в массив например
#2
Отправлено 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]
#3
Отправлено 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;
но лезут ошибки массивы он чтоли не понимает на объявлении переменных??
#4
Отправлено 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;
Дмитрий
#5
Отправлено 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 номер строки и столбца.
#6
Отправлено 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 номер строки и столбца.
Где же ты раньше был? :)
#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? Мож кто подскажет?
Спасибо.
#8
Отправлено 02 апреля 2008 - 13:19
А как его можно заставить ображаться к Sheet2? Мож кто подскажет?
Спасибо.
как-то так
Sys.OleObject("Excel.Application").Workbooks.Open("Sheet2").Cells(i, j).value
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#9
Отправлено 02 апреля 2008 - 14:01
А как его можно заставить ображаться к Sheet2? Мож кто подскажет?
Спасибо.
как-то так
Sys.OleObject("Excel.Application").Workbooks.Open("Sheet2").Cells(i, j).value
Разрулил :))
Сенкс.
#10
Отправлено 02 апреля 2008 - 14:23
А как его можно заставить ображаться к Sheet2? Мож кто подскажет?
Спасибо.
как-то так
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;
#11
Отправлено 03 апреля 2008 - 06:29
А как его можно заставить ображаться к Sheet2? Мож кто подскажет?
Спасибо.
как-то так
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
#12
Отправлено 03 апреля 2008 - 11:38
OleObject - работает оень медлено , я бы советовал испольовать DDT Driver:
function GetDataFromExcel(Path, Sheet,ammonth) // Достает данные с Еxcel }
Вот такая вот функция считыват как минимум в 5 раз быстрее данные с Excel чем OleObject
угу, только вот после 26ти обращений к ДДТ драйверу ТестКомплит вылетает с эксепшеном, что-то вроде "не могу создать еще одно подключение". DDT.CloseDriver даже не помогает.
Я тут потихоньку пишу класс для работы с экселем, ну и нагружаю его разными задачами для теста. Так вот, 256 ячеек считывается за 20 секунд. Не так уж и много. Зато более надежно
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#13
Отправлено 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 - и база дает больше возможностей в генерации и использовании тестовых данный :)
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных