IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> С++ Builder6 & Excel
18192123
сообщение 4.10.2009 21:10
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


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

Подскажите пожалуйста, можно ли содержимое компонента-таблицы StringGrid экспортировать в документ Excel?
Если да, то как это делается?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 19.10.2009 21:33
Сообщение #2


Гость






Цитата
Можно как-то вставить ещё один лист в книгу, когда обнаружится недостаток строк для экспорта..?
Легко:
bool SaveAsExcelFile(TStringGrid *AGrid, AnsiString ASheetName, AnsiString AFileName)
{
const int xlWBATWorksheet = -4167;
const int maxRowsInXL = 550; // Изменишь на 65535 (XL 2002-2003) или 1048576 (XL 2007)

Variant XLApp = CreateOleObject("Excel.Application");
try
{
// Hide Excel
XLApp.OlePropertySet("Visible", false);
// Add new Workbook
XLApp.OlePropertyGet("WorkBooks").OleFunction("Add", xlWBATWorksheet);

Variant Sheet =
XLApp.OlePropertyGet("Workbooks").OlePropertyGet("Item", 1).
OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);

int currStart = 0, counter = 1;
// А теперь начинается самое интересное...
while(currStart <= AGrid->RowCount)
{
Sheet.OlePropertySet("Name", (ASheetName + IntToStr(counter++)).c_str());

int bounds[4] = {0, maxRowsInXL, 0 , AGrid->ColCount };
Variant Array = VarArrayCreate(bounds, 3, varVariant);
for(int i = 0; i < min(AGrid->RowCount, maxRowsInXL); i++)
{
for(int j = 0; j< AGrid->ColCount; j++)
{
Array.PutElement(AGrid->Cells[j][currStart + i], i, j );
}
}

Variant Cell1 = Sheet.OlePropertyGet("Cells", 1, 1);
Variant Cell2 = Sheet.OlePropertyGet("Cells", maxRowsInXL + 1, AGrid->ColCount + 1);

Variant fRange = Sheet.OlePropertyGet("Range", Cell1, Cell2);
fRange.OlePropertySet("Value", Array);

currStart += maxRowsInXL;

if(currStart <= AGrid->RowCount) {
int count =
XLApp.OlePropertyGet("Workbooks").OlePropertyGet("Item", 1).
OlePropertyGet("Worksheets").OlePropertyGet("Count");
Variant AfterSheet =
XLApp.OlePropertyGet("Workbooks").OlePropertyGet("Item", 1).
OlePropertyGet("Worksheets").OlePropertyGet("Item", count);
Sheet =
XLApp.OlePropertyGet("Workbooks").OlePropertyGet("Item", 1).
OlePropertyGet("Worksheets").OleFunction("Add", Variant().NoParam(), AfterSheet);
}
}

XLApp.OlePropertySet("DisplayAlerts",false);
XLApp.OlePropertyGet("Workbooks").OlePropertyGet("Item", 1).OleProcedure("SaveAs", AFileName.c_str());
XLApp.OleProcedure("Quit");
}
catch(...)
{
ShowMessage("Экспорт данных - Ошибка !!!");
}
}
(тестировал на Excel XP + BDS 2009 на СтрингГриде, содержащем 2000 строк. Так вот эти 200 строк были корректно разбиты на 4 листа)
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 2:04
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"