Files
universal_is/client/src/pages/PrintReport.tsx
2025-01-31 15:53:58 +09:00

1070 lines
38 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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