C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
COM-сервера TExcelApplication, TExcelWorkbook..., Обращение к ячейкам xls-файла
Sam
Отправлено: 10.10.2003, 15:57


Не зарегистрирован







Помогите разобраться с Excel'евскими COM-серверами TExcelApplication, TExcelWorkbook, TExcelWorkSheet.
Есть две проблемы, большая и маленькая:
- большая: не могу получить доступ к ячейкам листа (прочитать, записать) через Range, Cell и т.п.;
- маленькая: ограничение длины имени листа (Sheet), для русских версий Excel это 5 знаков (как в имени по умолчанию "Лист1"),
а в english-версиях это 6 знаков (как в "Sheet1").
PS: решения через OleProperty не предлагать, хочется всё сделать через TExcel*.
Попутный вопрос: можно ли создавать xls-файлы без установленного на компьютере Excel (и без XLSReadWriteII)?
Пример моего кода (работающей части):
{...
// ------------------ запускаем сервер Excel ---------------------------------
bool ExcelWasClosed = false; //флаг запущенного Excel
_ApplicationDisp app; //диспетчер-интерфейс для работы с объектом Application
TNoParam qq; //отсутствие параметра (EmptyParam) в вызовах некоторых функций
try
{ //пытаемся присоединиться к запущенному Excel
HRESULT result=app.BindToActive(CLSID_ExcelApplication);
if (!SUCCEEDED(result)) //в системе нет запущенного Excel
{
ExcelWasClosed = true; //Excel всё-таки не запущен или даже не установлен
result=app.Bind(CLSID_ExcelApplication); //запускаем Excel
}
if (SUCCEEDED(result)) //проверка результата запуска
{
//--------------действия при установленном и запущенном Excel на компьютере------
//задаём имя файла для сохранения
MainFrm->MainSave->Title = "Экспорт данных в Excel ...";
MainFrm->MainSave->Filter = "Файлы MS Excel(*.xls)|*.xls|Все файлы (*.*)|*.*";
MainFrm->MainSave->DefaultExt = "xls";
if(MainFrm->MainSave->Execute())
{
if (ExcelWasClosed) app.Visible = true; //делаем видимым приложение, если это нужно

//работа с новой книгой (создаётся новый файл с книгой)
//число листов в новой книге
ExcelApplication1->SheetsInNewWorkbook[LOCALE_USER_DEFAULT] = 1;
//создали новую книгу
ExcelApplication1->Workbooks->Add();
//подключили компонент с формы к созданной книге
MyWorkbook->ConnectTo(ExcelApplication1->Get_Workbooks()->get_Item(1));
//сохранение в файл
MyWorkbook->SaveAs(MainFrm->MainSave->FileName,qq,qq,qq,qq,qq,xlNoChange,qq,qq,qq,qq,LOCALE_USER_DEFAULT);

//работа с листами в книге
//соединяемся с активным листом
MyWorksheet->ConnectTo(ExcelApplication1->ActiveSheet);
AnsiString qs = "abcdefgh";
int len=qs.Length(); //число символов в имени листа
//даём имя листу (довольно ракообразно) !!!!
MyWorksheet->Name = qs.WideChar(MyWorksheet->Name, len);

//работа с ячейками на листе
//вот здесь-то ничего и не получается !!!!

//закрытие файла с сохранением без переспрашивания
MyWorkbook->Close(true,qq,qq,LOCALE_USER_DEFAULT);
}
else
{
ShowMessage("Export in Excel: Файл " + MainFrm->MainSave->FileName + " не удаётся создать.");
}
if (ExcelWasClosed)
app.Quit(); //завершение работы с Excel, если он не был открыт до нас
}
else
{
ShowMessage("Не удалось запустить Excel. Возможно, он у Вас не установлен.");
return;
}
}
catch (Exception& E)
{
ShowMessage("Ошибка при работе с Excel.");
}
}
Borgir
Отправлено: 13.10.2003, 09:16


Дежурный стрелочник

Группа: Участник
Сообщений: 48



Я тоже сначала хотел в совей программе сделать через TExcelApplication и тд. Но затем плюнул на это дело и сделал через OLE. Единственное, что могу посоветовать, все переменные надо делать типа Variant.

Вернуться в Вопросы программирования в C++Builder