Цитата
Можно как-то вставить ещё один лист в книгу, когда обнаружится недостаток строк для экспорта..?
Легко:
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 листа)