1070 lines
38 KiB
TypeScript
1070 lines
38 KiB
TypeScript
import { Button, Flex } from "@mantine/core";
|
||
import { useState } from "react";
|
||
import createReport from 'docx-templates'
|
||
|
||
const xslTemplate = `<?xml version="1.0" encoding="utf-8"?>
|
||
<xsl:stylesheet version="1.0" xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Шаблон >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<xsl:template match="/">
|
||
<xsl:processing-instruction name="mso-application">
|
||
<xsl:text>progid="Excel.Sheet"</xsl:text>
|
||
</xsl:processing-instruction>
|
||
<Workbook>
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Стили шаблона >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Styles>
|
||
<Style ss:ID="Bordered1">
|
||
<Borders>
|
||
<Border ss:LineStyle="Continuous" ss:Position="Bottom" ss:Weight="1" />
|
||
<Border ss:LineStyle="Continuous" ss:Position="Left" ss:Weight="1" />
|
||
<Border ss:LineStyle="Continuous" ss:Position="Right" ss:Weight="1" />
|
||
<Border ss:LineStyle="Continuous" ss:Position="Top" ss:Weight="1" />
|
||
</Borders>
|
||
</Style>
|
||
<Style ss:ID="Bordered2">
|
||
<Borders>
|
||
<Border ss:LineStyle="Continuous" ss:Position="Bottom" ss:Weight="2" />
|
||
<Border ss:LineStyle="Continuous" ss:Position="Left" ss:Weight="2" />
|
||
<Border ss:LineStyle="Continuous" ss:Position="Right" ss:Weight="2" />
|
||
<Border ss:LineStyle="Continuous" ss:Position="Top" ss:Weight="2" />
|
||
</Borders>
|
||
</Style>
|
||
<Style ss:ID="Column" ss:Parent="Bordered2">
|
||
<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1" />
|
||
<Font ss:Color="#000000" ss:FontName="Arial Cyr" x:CharSet="204" />
|
||
</Style>
|
||
<Style ss:ID="Cell1" ss:Parent="Bordered1">
|
||
<Font ss:Bold="1" ss:Color="#000000" ss:FontName="Arial Cyr" x:CharSet="204" />
|
||
<Interior ss:Color="#47FF19" ss:Pattern="Solid" />
|
||
</Style>
|
||
<Style ss:ID="Cell2" ss:Parent="Bordered1">
|
||
<Font ss:Bold="1" ss:Color="#003366" ss:FontName="Arial Cyr" x:CharSet="204" />
|
||
<Interior ss:Color="#F2FF02" ss:Pattern="Solid" />
|
||
</Style>
|
||
<Style ss:ID="Cell3" ss:Parent="Bordered1">
|
||
<Font ss:Bold="1" ss:Color="#333333" ss:FontName="Arial Cyr" x:CharSet="204" />
|
||
<Interior ss:Color="#C0C0C0" ss:Pattern="Solid" />
|
||
</Style>
|
||
<Style ss:ID="Cell4" ss:Parent="Bordered1">
|
||
<Font ss:Color="#000000" ss:FontName="Arial Cyr" x:CharSet="204" />
|
||
</Style>
|
||
|
||
<Style ss:ID="CellReg" ss:Parent="Bordered1">
|
||
<Font ss:Color="#003366" ss:FontName="Arial Cyr" x:CharSet="204" />
|
||
|
||
</Style>
|
||
<Style ss:ID="CellCity" ss:Parent="Bordered1">
|
||
<Font ss:Color="#333333" ss:FontName="Arial Cyr" x:CharSet="204" />
|
||
|
||
</Style>
|
||
</Styles>
|
||
<Worksheet ss:Name="Жилищний фонд">
|
||
<Table>
|
||
<Column ss:Width="100" />
|
||
<Column ss:Width="100" />
|
||
<Column ss:Width="100" />
|
||
<Column ss:Width="150" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="70" />
|
||
<Column ss:Width="70" />
|
||
<Column ss:Width="70" />
|
||
<Column ss:Width="70" />
|
||
<Column ss:Width="70" />
|
||
<Column ss:Width="70" />
|
||
<Column ss:Width="70" />
|
||
<Column ss:Width="70" />
|
||
<Column ss:Width="80" />
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Столбцы таблицы >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Регион</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Нас. пункт</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Котельная</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Адрес</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Кол-во домов</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Этаж.</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Общая пл.</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Кол-во прожив.</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Отопление</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">ГВС</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">ХВС</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Канализация</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Сальдо исход.</Data>
|
||
</Cell>
|
||
</Row>
|
||
<Row>
|
||
<Cell ss:Index="9" ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Сумма</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Сумма</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Сумма</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Сумма</Data>
|
||
</Cell>
|
||
</Row>
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Данные таблицы >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<xsl:apply-templates select="//Kvp" />
|
||
</Table>
|
||
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
|
||
<FreezePanes />
|
||
<FrozenNoSplit />
|
||
<SplitHorizontal>2</SplitHorizontal>
|
||
<TopRowBottomPane>2</TopRowBottomPane>
|
||
<ActivePane>2</ActivePane>
|
||
</WorksheetOptions>
|
||
</Worksheet>
|
||
<Worksheet ss:Name="Договорные подключения">
|
||
<Table>
|
||
<Column ss:Width="100" />
|
||
<Column ss:Width="100" />
|
||
<Column ss:Width="100" />
|
||
<Column ss:Width="150" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="50" />
|
||
<Column ss:Width="70" />
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Столбцы таблицы >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Регион</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Нас. пункт</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Котельная</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Наименование</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Кол-во объектов</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем здания</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Отопление</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Подогрев</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">ГВС</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">ХВС</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Канализация</Data>
|
||
</Cell>
|
||
<Cell ss:MergeDown="1" ss:StyleID="Column">
|
||
<Data ss:Type="String">Итого</Data>
|
||
</Cell>
|
||
</Row>
|
||
<Row>
|
||
<Cell ss:Index="7" ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Сумма</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Сумма</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Сумма</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Сумма</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Объем</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Column">
|
||
<Data ss:Type="String">Сумма</Data>
|
||
</Cell>
|
||
</Row>
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Данные таблицы >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<xsl:apply-templates select="//Jur" />
|
||
</Table>
|
||
</Worksheet>
|
||
</Workbook>
|
||
</xsl:template>
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Шаблон данных >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<xsl:template match="Kvp">
|
||
<xsl:choose>
|
||
<xsl:when test="style_id = 1">
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Строка с улусом >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:MergeAcross="3" ss:StyleID="Cell1">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="region" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="house_count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="String" />
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="square" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="people_count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_heat" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_heat" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_hwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_hwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_cwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_cwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_sewers" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_sewers" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="saldo_out" />
|
||
</Data>
|
||
</Cell>
|
||
</Row>
|
||
</xsl:when>
|
||
<xsl:when test="style_id = 2">
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Строка с населенным пунктом >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="region" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:Index="2" ss:MergeAcross="2" ss:StyleID="Cell2">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="city" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="house_count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="String" />
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="square" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="people_count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_heat" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_heat" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_hwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_hwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_cwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_cwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_sewers" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_sewers" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="saldo_out" />
|
||
</Data>
|
||
</Cell>
|
||
</Row>
|
||
</xsl:when>
|
||
<xsl:when test="style_id = 3">
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Строка с котельной >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="region" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="city" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:Index="3" ss:MergeAcross="1" ss:StyleID="Cell3">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="boiler" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="house_count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="String" />
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="square" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="people_count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_heat" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_heat" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_hwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_hwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_cwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_cwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_sewers" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_sewers" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="saldo_out" />
|
||
</Data>
|
||
</Cell>
|
||
</Row>
|
||
</xsl:when>
|
||
<xsl:when test="style_id = 4">
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Строка с объектами >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:StyleID="CellReg">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="region" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:Index="2" ss:StyleID="CellCity">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="city" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:Index="3" ss:StyleID="Cell3">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="boiler" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:Index="4" ss:StyleID="Cell4">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="address" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="floors" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="square" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="people_count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_heat" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_heat" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_hwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_hwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_cwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_cwater" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="volume_sewers" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_sewers" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="saldo_out" />
|
||
</Data>
|
||
</Cell>
|
||
</Row>
|
||
</xsl:when>
|
||
</xsl:choose>
|
||
</xsl:template>
|
||
<xsl:template match="Jur">
|
||
<xsl:choose>
|
||
<xsl:when test="style_id = 1">
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Строка с улусом >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:MergeAcross="3" ss:StyleID="Cell1">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="reg" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="building_volume" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="heat_volume" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="heat_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="gcal_ost" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="gcal_ost_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="hw_vol" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="hw_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="vol_xvs" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_xvs" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="vol_kan" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_kan" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell1">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="all_summa" />
|
||
</Data>
|
||
</Cell>
|
||
</Row>
|
||
</xsl:when>
|
||
<xsl:when test="style_id = 2">
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Строка с населенным пунктом >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="reg" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:Index="2" ss:MergeAcross="2" ss:StyleID="Cell2">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="city" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="building_volume" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="heat_volume" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="heat_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="gcal_ost" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="gcal_ost_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="hw_vol" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="hw_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="vol_xvs" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_xvs" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="vol_kan" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_kan" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell2">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="all_summa" />
|
||
</Data>
|
||
</Cell>
|
||
</Row>
|
||
</xsl:when>
|
||
<xsl:when test="style_id = 3">
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Строка с котельной >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="reg" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="city" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:Index="3" ss:MergeAcross="1" ss:StyleID="Cell3">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="boiler" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="count" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="building_volume" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="heat_volume" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="heat_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="gcal_ost" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="gcal_ost_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="hw_vol" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="hw_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="vol_xvs" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_xvs" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="vol_kan" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_kan" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell3">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="all_summa" />
|
||
</Data>
|
||
</Cell>
|
||
</Row>
|
||
</xsl:when>
|
||
<xsl:when test="style_id = 4">
|
||
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Строка с объектами >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
|
||
<Row>
|
||
<Cell ss:StyleID="CellReg">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="reg" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:Index="2" ss:StyleID="CellCity">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="city" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:Index="3" ss:StyleID="Cell3">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="boiler" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:MergeAcross="1" ss:Index="4" ss:StyleID="Cell4">
|
||
<Data ss:Type="String">
|
||
<xsl:value-of select="name" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="building_volume" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="heat_volume" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="heat_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="gcal_ost" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="gcal_ost_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="hw_vol" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="hw_summa" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="vol_xvs" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_xvs" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="vol_kan" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="sum_kan" />
|
||
</Data>
|
||
</Cell>
|
||
<Cell ss:StyleID="Cell4">
|
||
<Data ss:Type="Number">
|
||
<xsl:value-of select="all_summa" />
|
||
</Data>
|
||
</Cell>
|
||
</Row>
|
||
</xsl:when>
|
||
</xsl:choose>
|
||
</xsl:template>
|
||
</xsl:stylesheet>`
|
||
|
||
const PrintReport = () => {
|
||
const [loading, setLoading] = useState(false);
|
||
|
||
const generateDocx = async () => {
|
||
setLoading(true);
|
||
|
||
try {
|
||
// Fetch the DOCX template from the public folder
|
||
const response = await fetch("/template.docx");
|
||
const response_table = await fetch("/template_table.docx");
|
||
const templateArrayBuffer = await response.arrayBuffer();
|
||
const templateArrayBuffer_table = await response_table.arrayBuffer();
|
||
|
||
// Convert ArrayBuffer to Uint8Array (Fix TypeScript error)
|
||
const templateUint8Array = new Uint8Array(templateArrayBuffer);
|
||
const templateUint8Array_table = new Uint8Array(templateArrayBuffer_table);
|
||
|
||
// Fetch the image (Example: Load from public folder)
|
||
const imageResponse = await fetch("/test.png"); // Change this to your image path
|
||
const imageBlob = await imageResponse.blob();
|
||
const imageArrayBuffer = await imageBlob.arrayBuffer();
|
||
const imageUint8Array = new Uint8Array(imageArrayBuffer);
|
||
|
||
// Generate the DOCX file with the replacement
|
||
const report = await createReport({
|
||
template: templateUint8Array, // Ensure it's Uint8Array
|
||
data: {
|
||
test: "Hello World",
|
||
myImage: {
|
||
width: 6, // Width in cm
|
||
height: 6, // Height in cm
|
||
data: imageUint8Array, // Image binary data
|
||
extension: ".png", // Specify the image format
|
||
},
|
||
},
|
||
});
|
||
|
||
const report_table = await createReport({
|
||
template: templateUint8Array_table, // Ensure it's Uint8Array
|
||
data: {
|
||
test: "Hello World",
|
||
rows: [
|
||
{
|
||
first: 'A',
|
||
second: 'B',
|
||
third: 'C',
|
||
fourth: 'D',
|
||
},
|
||
{
|
||
first: 'E',
|
||
second: 'F',
|
||
third: 'G',
|
||
fourth: 'H',
|
||
},
|
||
{
|
||
first: 'I',
|
||
second: 'J',
|
||
third: 'K',
|
||
fourth: 'L',
|
||
}
|
||
]
|
||
},
|
||
});
|
||
|
||
// Convert Uint8Array to a Blob
|
||
const blob = new Blob([report], {
|
||
type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||
});
|
||
|
||
const blob_table = new Blob([report_table], {
|
||
type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||
});
|
||
|
||
// Create a download link and trigger the download
|
||
const url = URL.createObjectURL(blob);
|
||
const a = document.createElement("a");
|
||
a.href = url;
|
||
a.download = "report.docx";
|
||
document.body.appendChild(a);
|
||
a.click();
|
||
document.body.removeChild(a);
|
||
|
||
// Create a download link and trigger the download
|
||
const url_table = URL.createObjectURL(blob_table);
|
||
const a_table = document.createElement("a");
|
||
a_table.href = url_table;
|
||
a_table.download = "report_table.docx";
|
||
document.body.appendChild(a_table);
|
||
a_table.click();
|
||
document.body.removeChild(a_table);
|
||
|
||
// Revoke the object URL after download
|
||
URL.revokeObjectURL(url);
|
||
URL.revokeObjectURL(url_table);
|
||
} catch (error) {
|
||
console.error("Error generating DOCX:", error);
|
||
} finally {
|
||
setLoading(false);
|
||
}
|
||
}
|
||
|
||
const handleGenerateExcel = () => {
|
||
// Define the example XML data
|
||
const xmlData = `
|
||
<root>
|
||
<Kvp>
|
||
<style_id>1</style_id>
|
||
<region>Region 1</region>
|
||
<city>City 1</city>
|
||
<house_count>10</house_count>
|
||
<square>1000</square>
|
||
<people_count>500</people_count>
|
||
<volume_heat>200</volume_heat>
|
||
<sum_heat>1000</sum_heat>
|
||
<volume_hwater>300</volume_hwater>
|
||
<sum_hwater>1500</sum_hwater>
|
||
<volume_cwater>400</volume_cwater>
|
||
<sum_cwater>2000</sum_cwater>
|
||
<volume_sewers>500</volume_sewers>
|
||
<sum_sewers>2500</sum_sewers>
|
||
<saldo_out>300</saldo_out>
|
||
</Kvp>
|
||
</root>
|
||
`;
|
||
|
||
// Parse the XSL template and XML data
|
||
const parser = new DOMParser();
|
||
const xslDoc = parser.parseFromString(xslTemplate, "application/xml");
|
||
const xmlDoc = parser.parseFromString(xmlData, "application/xml");
|
||
|
||
// Apply the transformation
|
||
const xsltProcessor = new XSLTProcessor();
|
||
xsltProcessor.importStylesheet(xslDoc);
|
||
const resultDocument = xsltProcessor.transformToDocument(xmlDoc);
|
||
|
||
// Serialize the result to a string
|
||
const serializer = new XMLSerializer();
|
||
const resultXml = serializer.serializeToString(resultDocument);
|
||
|
||
// Add missing Excel-specific headers if needed
|
||
const correctedXml = `<?xml version="1.0" encoding="utf-8"?>\n` + resultXml
|
||
|
||
// Convert to Blob and trigger download
|
||
const blob = new Blob([correctedXml], { type: "application/vnd.ms-excel" });
|
||
const url = URL.createObjectURL(blob);
|
||
const link = document.createElement("a");
|
||
link.href = url;
|
||
link.download = "template.xls";
|
||
link.click();
|
||
|
||
// Clean up
|
||
URL.revokeObjectURL(url);
|
||
}
|
||
|
||
return (
|
||
<Flex p='sm' gap='sm'>
|
||
<Button onClick={generateDocx} disabled={loading}>{loading ? "Генерация отчета..." : "Сохранить в docx"}</Button>
|
||
<Button onClick={handleGenerateExcel}>Сохранить в Excel</Button>
|
||
</Flex>
|
||
)
|
||
}
|
||
|
||
export default PrintReport |