|
![]() |
#1 |
Участник
|
to AnGor За информацию - спасибо, буду иметь ввиду. Только здесь решалась не просто задача на быстрый вывод в excel. Хотелось следующее. Есть темплейт xltx. На листе - некая область (колонки, табличная часть, подвал). По логике отчета эта область размножается/ копируется с последующей вставкой данных, условно, по разным подразделениям, число которых заранее не известно. Чтобы не париться с подсчетами количества строк, реализовывалась идея создать нужное число именованных Range, ориентируясь на которые скопировать образец с форматированием и вставлять соответствующие данные, используя только относительные смещения (абсолютные координаты знает конкретный Range, а я их знать не хочу).
Задачу решил, обойдя NET по периметру. Именованные Range скопировал еще при подготовке шаблона (job через COM), взяв их число с запасом. При формировании отчета (я привязан к NET) просто вставляю данные в нужный Range, получив его имя по номеру. Работает. Удобно. Легко сопровождаемо и наращиваемо. Просто жаль, что такой удобный механизм, как именованный Range приходится использовать…через подобную проктологию. |
|
![]() |
#2 |
Участник
|
Пару месяцев нвзад была очень похожая задача - один в один
![]() С первой по третью строку шапка, 4 и 5 - строка Итоговый вид так я множу шапку: X++: public boolean pasteRepHeader(OfficeOpenXml.ExcelWorksheet _ExcelWorksheet, int _row) { #define.RepHeader('RepHeader') #define.tmp('tmp') OfficeOpenXml.ExcelWorksheet fromExcelWorksheet; OfficeOpenXml.ExcelRange fromExcelRange; OfficeOpenXml.ExcelRange toExcelRange; boolean ret = true; fromExcelWorksheet = excelEPPLus.getWorksheet(#tmp); fromExcelRange = fromExcelWorksheet.get_Cells(); toExcelRange = _ExcelWorksheet.get_Cells(); fromExcelRange = fromExcelRange.get_Item(1,1,3,11); toExcelRange = toExcelRange.get_Item(_row,1,_row+3,11); fromExcelRange.Copy(toExcelRange); return ret; } X++: public boolean pasteRepLine(OfficeOpenXml.ExcelWorksheet _ExcelWorksheet, int _row) { #define.tmp('tmp') OfficeOpenXml.ExcelWorksheet fromExcelWorksheet; OfficeOpenXml.ExcelRange fromExcelRange; OfficeOpenXml.ExcelRange toExcelRange; boolean ret = true; fromExcelWorksheet = excelEPPLus.getWorksheet(#tmp); fromExcelRange = fromExcelWorksheet.get_Cells(); toExcelRange = _ExcelWorksheet.get_Cells(); fromExcelRange = fromExcelRange.get_Item(4,1,5,11); toExcelRange = toExcelRange.get_Item(_row,1,_row+1,11); fromExcelRange.Copy(toExcelRange); return ret; } X++: ...
excelColumn = ExcelWorksheet.Column(_col);
excelColumn.set_PageBreak(true);
... ![]() |
|