void __fastcall TForm1::toExcelCell(int Row,int Column, AnsiString data)
{
try {
Variant cur = Sh.OlePropertyGet("Cells", Row,Column);
cur.OlePropertySet("Value", data.c_str());
} catch(...) { ; }
}
Добавление данных в Exel
Функция toExelCell добавляет данные в книгу Exel, заполняя 1,2,3 столбцы данными, проблема в том, что toExelCell постоянно не добавляет данные (то есть удлиняя столбцы), она их заменяет. Естественно потому что параметр Row при каждом добавление данных один и тот же. Через что можно реализовать работу функции toExelCell так чтобы параметр Row начинался с последней пустой ячейки столбца.
Функция в студию:
Код:
Необходимо получить последнюю использованную строку - а затем выполнять приращение.
Цитата: kot_
Необходимо получить последнюю использованную строку - а затем выполнять приращение.
я об этом и спрашиваю,как ее получить?
есть вариант сохранить номер строки после использования цикла, который собственно и добавляет данные в Книгу
в отдельный файл, и постоянно его перезаписывать. Но мне кажется есть проще вариант.
Цитата: Patr1ot
я об этом и спрашиваю,как ее получить?
есть вариант сохранить номер строки после использования цикла, который собственно и добавляет данные в Книгу
в отдельный файл, и постоянно его перезаписывать. Но мне кажется есть проще вариант.
есть вариант сохранить номер строки после использования цикла, который собственно и добавляет данные в Книгу
в отдельный файл, и постоянно его перезаписывать. Но мне кажется есть проще вариант.
Код:
XLSheet.OlePropertyGet("Cells").OlePropertyGet("SpecialCells",xlCellTypeLastCell).OleProcedure("Activate");
int row_last = MSExcel.OlePropertyGet("ActiveCell").OlePropertyGet("Row");
int row_last = MSExcel.OlePropertyGet("ActiveCell").OlePropertyGet("Row");
Код:
App.OlePropertyGet("WorkBooks").OleProcedure("add");
Sh = App.OlePropertyGet("Worksheets").OlePropertyGet("Item",1);
Sh = App.OlePropertyGet("Worksheets").OlePropertyGet("Item",1);
при таком методе открытия, пишу данные в Excel, но по непонятной мне причине, описание:
Данные выгружаются в столбец , последняя № последней строки 100, номер последней строки запомнил так:
Код:
Sh.OlePropertyGet("Cells").OlePropertyGet("SpecialCells",xlCellTypeLastCell).OleProcedure("Activate");
row_last = App.OlePropertyGet("ActiveCell").OlePropertyGet("Row");
row_last = App.OlePropertyGet("ActiveCell").OlePropertyGet("Row");
перед следующей выгрузкой указываю начало строки №100, и вот чудеса почему то после второй выгрузки также 100 строк, строки первой выгрузки от 0 - 100 становятся пустыми, а строки второй выгрузки от 100 - 200 заполнеными, и т.д. после 3-й выгрузки строки от 0-100 и от 100-200 пустые а строки от 200-300 заполнены данными 3-й выгрузки.
в чем косяк непоку понять книга и файл одни и теже.
Сохраняю вот так:
Код:
App.OlePropertySet("DisplayAlerts", false);
AnsiString put = GetCurrentDir()+"\\Base\\"+Label5->Caption+".xlsx";
App.OlePropertyGet("WorkSheets",1).OleProcedure("SaveAs",put.c_str());
App.OlePropertyGet("WorkSheets",1).OleProcedure("Quit");
AnsiString put = GetCurrentDir()+"\\Base\\"+Label5->Caption+".xlsx";
App.OlePropertyGet("WorkSheets",1).OleProcedure("SaveAs",put.c_str());
App.OlePropertyGet("WorkSheets",1).OleProcedure("Quit");
Вместо того, что бы писать такое количество букв в форум, достаточно запустить отладчик и проверить, в какие на самом деле ячейки записываются данные. Для этого всего навсего надо установить точку останова там где это происходит.
Цитата: kot_
Вместо того, что бы писать такое количество букв в форум, достаточно запустить отладчик и проверить, в какие на самом деле ячейки записываются данные. Для этого всего навсего надо установить точку останова там где это происходит.
Нашел...
Код:
if(File!="")
{
AnsiString ff = "Rodonitov_19_Enter" ;
App.OlePropertyGet("WorkBooks").OleProcedure("Open",ff.c_str());
Sh=App.OlePropertyGet("WorkSheets",1);
Sh.OlePropertyGet("Activate");
}
else
{
App.OlePropertyGet("WorkBooks").OleProcedure("add");
Sh=App.OlePropertyGet("WorkSheets",1);
Sh.OlePropertyGet("Activate");
}
} catch(...) {
Application->MessageBox("Îøèáêà îòêðûòèÿ êíèãè Microsoft Excel!","Îøèáêà",MB_OK+MB_ICONERROR);
Label10->Caption=File+3;
}
{
AnsiString ff = "Rodonitov_19_Enter" ;
App.OlePropertyGet("WorkBooks").OleProcedure("Open",ff.c_str());
Sh=App.OlePropertyGet("WorkSheets",1);
Sh.OlePropertyGet("Activate");
}
else
{
App.OlePropertyGet("WorkBooks").OleProcedure("add");
Sh=App.OlePropertyGet("WorkSheets",1);
Sh.OlePropertyGet("Activate");
}
} catch(...) {
Application->MessageBox("Îøèáêà îòêðûòèÿ êíèãè Microsoft Excel!","Îøèáêà",MB_OK+MB_ICONERROR);
Label10->Caption=File+3;
}
У меня постоянно добавляется новая книга, OleProcedure("add");. Почему то никак не работает открытие книги OleProcedure("Open",ff.c_str())
я и полностью имя файла с указанием пути и расширение указывал, не хочет открывать книгу и все, хот по монитору тресни:). Почему не могу понять.
Вся процедура открытия книги Excel:
Код:
void __fastcall TForm1::ExcelInit(AnsiString File)
{
try {
App=Variant::GetActiveObject("Excel.Application");
} catch(...) {
try {
App=Variant::CreateObject("Excel.Application"); } catch (...) {
Application->MessageBox("Íåâîçìîæíî îòêðûòü Microsoft Excel!"
" Âîçìîæíî ýòîãî ïðèëîæåíèÿ íà êîìïüþòåðå íå óñòàíîâëåíî.","Îøèáêà",MB_OK+MB_ICONERROR);
}
}
try {
if(File!="")
{
AnsiString ff = "Rodonitov_19_Enter" ;
App.OlePropertyGet("WorkBooks").OleProcedure("Open",ff.c_str());
Sh=App.OlePropertyGet("WorkSheets",1);
Sh.OlePropertyGet("Activate");
}
else
{
App.OlePropertyGet("WorkBooks").OleProcedure("add");
Sh=App.OlePropertyGet("WorkSheets",1);
Sh.OlePropertyGet("Activate");
}
} catch(...) {
Application->MessageBox("Îøèáêà îòêðûòèÿ êíèãè Microsoft Excel!","Îøèáêà",MB_OK+MB_ICONERROR);
Label10->Caption=File+3;
}
}
{
try {
App=Variant::GetActiveObject("Excel.Application");
} catch(...) {
try {
App=Variant::CreateObject("Excel.Application"); } catch (...) {
Application->MessageBox("Íåâîçìîæíî îòêðûòü Microsoft Excel!"
" Âîçìîæíî ýòîãî ïðèëîæåíèÿ íà êîìïüþòåðå íå óñòàíîâëåíî.","Îøèáêà",MB_OK+MB_ICONERROR);
}
}
try {
if(File!="")
{
AnsiString ff = "Rodonitov_19_Enter" ;
App.OlePropertyGet("WorkBooks").OleProcedure("Open",ff.c_str());
Sh=App.OlePropertyGet("WorkSheets",1);
Sh.OlePropertyGet("Activate");
}
else
{
App.OlePropertyGet("WorkBooks").OleProcedure("add");
Sh=App.OlePropertyGet("WorkSheets",1);
Sh.OlePropertyGet("Activate");
}
} catch(...) {
Application->MessageBox("Îøèáêà îòêðûòèÿ êíèãè Microsoft Excel!","Îøèáêà",MB_OK+MB_ICONERROR);
Label10->Caption=File+3;
}
}
Вот я мудак...
Как отсеять повторяющиеся значения в ячейках.
Тупо сравнивать значения? Это накладно на процесс работы приложения.
Может кто знает решение по проще.
задача. Столбец, из него нужно удалить повторяющиеся значения, причем удалить не просто значение ячейки а сразу всю строку со сдвигом вверх.
Гугл и поиск результатов не дали.
Код:
XLSheet.OlePropertyGet("Rows","7:7").OleProcedure("Select");
MSExcel.OlePropertyGet("ActiveCell").OleProcedure("Delete").OlePropertyGet(""Shift","xlUp");
MSExcel.OlePropertyGet("ActiveCell").OleProcedure("Delete").OlePropertyGet(""Shift","xlUp");
удалит седьмую строку.
Код:
XLSheet.OlePropertyGet("Rows","7:15").OleProcedure("Select");
MSExcel.OlePropertyGet("ActiveCell").OleProcedure("Delete").OlePropertyGet(""Shift","xlUp");
MSExcel.OlePropertyGet("ActiveCell").OleProcedure("Delete").OlePropertyGet(""Shift","xlUp");
удалит строки с седьмой по пятнадцатую.
Код не тестировался, может содержать несущественные ошибки.