diff --git a/apps/fo/app/components/common/CommaToNumber.tsx b/apps/fo/app/components/common/CommaToNumber.tsx new file mode 100644 index 000000000..78bffe40d --- /dev/null +++ b/apps/fo/app/components/common/CommaToNumber.tsx @@ -0,0 +1,4 @@ +export default function CommaToNumber (data: any){ + const rtnValue = data&&data.toString().trim()!=''&&data!=undefined?Number(data.toString().replaceAll(',','')):''; + return rtnValue; +} \ No newline at end of file diff --git a/apps/fo/app/pages/(with-layout)/dashboard/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/page.tsx index a09431598..77e4168ec 100644 --- a/apps/fo/app/pages/(with-layout)/dashboard/page.tsx +++ b/apps/fo/app/pages/(with-layout)/dashboard/page.tsx @@ -159,7 +159,7 @@ export default function DashBoard() { const excelData1 = planFcltyList.map((item) => { return [ item.item, - item.provisionalApproval, + Number(item.provisionalApproval.toString().replaceAll(',',''))?Number(item.provisionalApproval.toString().replaceAll(',','')):item.provisionalApproval, item.now, item.stepOne, item.stepTwo, @@ -171,23 +171,24 @@ export default function DashBoard() { // operationalStatusList를 2차원 배열로 변환 const excelData2 = operationalStatusList.map((item, index) => { const baseData = [ - item.yearAvg, - item.yearMax, - item.yearMin, - item.summerAll, - item.summerThree, - item.summerRain, - item.winterAll, - item.winterSunnyAvg, - item.winterSunnyMax, - item.winterSunnyMin, - item.groundWaterAvg, - item.groundWaterSummer, - item.groundWaterWinter + Number(item.yearAvg?.replaceAll(',','')), + Number(item.yearMax?.replaceAll(',','')), + Number(item.yearMin?.replaceAll(',','')), + Number(item.summerAll?.replaceAll(',','')), + Number(item.summerThree?.replaceAll(',','')), + Number(item.summerRain?.replaceAll(',','')), + Number(item.winterAll?.replaceAll(',','')), + Number(item.winterSunnyAvg?.replaceAll(',','')), + Number(item.winterSunnyMax?.replaceAll(',','')), + Number(item.winterSunnyMin?.replaceAll(',','')), + Number(item.groundWaterAvg?.replaceAll(',','').replaceAll('%','')), + Number(item.groundWaterSummer?.replaceAll(',','').replaceAll('%','')), + Number(item.groundWaterWinter?.replaceAll(',','').replaceAll('%','')) ]; // index가 0일 때만 rdi와 rdiRain 추가 - return index === 0 ? [...baseData, item.rdi, item.rdiRain] : baseData; + console.log(item.rdiRain); + return index === 0 ? [...baseData, item.rdi&&item.rdi.toString().trim()!=''?Number(item.rdi.toString().replaceAll(',','')):'', item.rdiRain&&item.rdiRain.toString().trim()!=''?Number(item.rdiRain.toString().replaceAll(',','')):''] : baseData; }); const sheetParameter = [ diff --git a/apps/fo/app/pages/(with-layout)/facilityWaterQlty/modal/page.tsx b/apps/fo/app/pages/(with-layout)/facilityWaterQlty/modal/page.tsx index 948d05b1d..e76778d89 100644 --- a/apps/fo/app/pages/(with-layout)/facilityWaterQlty/modal/page.tsx +++ b/apps/fo/app/pages/(with-layout)/facilityWaterQlty/modal/page.tsx @@ -5,16 +5,17 @@ */ "use client" +import CommaToNumber from "@/app/components/common/CommaToNumber"; +import { roundNumber } from "@/app/components/common/DataForm"; +import UnderComment from "@/app/components/common/UnderComment"; import { useFoStore } from "@/app/store"; import type { FacilityWaterQltyProps, modalExcelType } from "@/app/store/facilityWaterQlty"; -import { downloadExcel, UITab, UiTable } from "@common/business_components/ui"; +import { downloadExcelFormat, UITab, UiTable } from "@common/business_components/ui"; import { Button, TabsContent } from "@common/components/ui"; import { useCallback, useEffect, useRef, useState } from "react"; import type { ReturnType } from "../../../../components/common/FacilityTermModalHeader"; import FacilityTermModalHeader from "../../../../components/common/FacilityTermModalHeader"; import { HeadMakeColSpan } from "../HeadMakeColSpan"; -import { roundNumber } from "@/app/components/common/DataForm"; -import UnderComment from "@/app/components/common/UnderComment"; const commentArrayChungchun = [ "청천시 : 강우량이 3mm미만의 날" @@ -355,22 +356,29 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe copyYearList.forEach((item) => { excelDownList.push({ 날짜: item.msrDt, - "유입BOD(mg/L)": item.inflAssctBfrWqltBod, - "유입TOC(COD)(mg/L)": item.inflAssctBfrWqltToc, - "유입SS(mg/L)": item.inflAssctBfrWqltSs, - "유입TN(mg/L)": item.inflAssctBfrWqltTn, - "유입TP(mg/L)": item.inflAssctBfrWqltTp, - "유출BOD(mg/L)": item.efflWqltBod, - "유출TOC(COD)(mg/L)": item.efflWqltToc, - "유출SS(mg/L)": item.efflWqltSs, - "유출TN(mg/L)": item.efflWqltTn, - "유출TP(mg/L)": item.efflWqltTp, -/* "강우량(mm/일)": item.infoRnDay?item.infoRnDay.toString():"0.0", */ + "유입BOD(mg/L)": CommaToNumber(item.inflAssctBfrWqltBod), + "유입TOC(COD)(mg/L)": CommaToNumber(item.inflAssctBfrWqltToc), + "유입SS(mg/L)": CommaToNumber(item.inflAssctBfrWqltSs), + "유입TN(mg/L)": CommaToNumber(item.inflAssctBfrWqltTn), + "유입TP(mg/L)": CommaToNumber(item.inflAssctBfrWqltTp), + "유출BOD(mg/L)": CommaToNumber(item.efflWqltBod), + "유출TOC(COD)(mg/L)": CommaToNumber(item.efflWqltToc), + "유출SS(mg/L)": CommaToNumber(item.efflWqltSs), + "유출TN(mg/L)": CommaToNumber(item.efflWqltTn), + "유출TP(mg/L)": CommaToNumber(item.efflWqltTp), + "강우량(mm/일)": CommaToNumber(item.infoRnDay?item.infoRnDay.toString():"0.0"), }); }); } if (excelDownList && excelDownList.length > 0) { - downloadExcel({ data: JSON.parse(JSON.stringify(excelDownList)), fileName: searchYear+'년 '+fcltyName + ' 수질현황', sheetNameArray: [fcltyName + ' 수질현황'], headerRange: 'A1:K1' }); + downloadExcelFormat( + { data: JSON.parse(JSON.stringify(excelDownList)) + , fileName: searchYear+'년 '+fcltyName + ' 수질현황' + , sheetNameArray: [fcltyName + ' 수질현황'] + , headerRange: 'A1:L1' + , decimalArray1: [1,2,3,6,7,8,11] + , decimalArray3: [4,5,9,10] + }); } else if (prevExcelListRef.current && prevExcelListRef.current.length > 0) { alert('다운받을 데이터가 없습니다.'); } diff --git a/apps/fo/app/pages/(with-layout)/facilityWaterQlty/page.tsx b/apps/fo/app/pages/(with-layout)/facilityWaterQlty/page.tsx index a188f60b9..a107dfd2a 100644 --- a/apps/fo/app/pages/(with-layout)/facilityWaterQlty/page.tsx +++ b/apps/fo/app/pages/(with-layout)/facilityWaterQlty/page.tsx @@ -8,12 +8,12 @@ import { useFoStore } from "@/app/store"; import type { TableUpperProps } from "@/app/store/common"; -import { ContentsDiv, downloadExcel, MainDiv, SearchBaseForm, SearchInput, SelectBox, Title, UiModal, UiTable, type ReturnType } from "@common/business_components"; +import type { FacilityWaterQltyProps } from "@/app/store/facilityWaterQlty"; +import { ContentsDiv, downloadExcelFormat, MainDiv, SearchBaseForm, SearchInput, SelectBox, Title, UiModal, UiTable, type ReturnType } from "@common/business_components"; import ListDiv from "@common/business_components/ui/list_div"; +import LoadingOverlay from "@common/business_components/ui/loadingBar"; import { useCallback, useEffect, useRef, useState } from "react"; import WaterQualityModal from "./modal/page"; -import type { FacilityWaterQltyProps } from "@/app/store/facilityWaterQlty"; -import LoadingOverlay from "@common/business_components/ui/loadingBar"; export default function ProcessFacilitySearch() { const { Common @@ -144,12 +144,23 @@ export default function ProcessFacilitySearch() { useEffect(() => { if (excelList && excelList.length > 0) { - downloadExcel({ + downloadExcelFormat( + { + data: excelList as unknown as JSON[], + fileName: '시설별 수질현황', + sheetNameArray: ['시설별 수질현황'], + headerRange: 'A1:T1', + decimalArray1:[10,11,12,15,16,17], + decimalArray3:[13,14,18,19] + } + ); + + /* downloadExcel({ data: excelList as unknown as JSON[], fileName: '시설별 수질현황', sheetNameArray: ['시설별 수질현황'], headerRange: 'A1:T1' - }); + }); */ } }, [excelList]); diff --git a/apps/fo/app/pages/(with-layout)/flowRate/modal/page.tsx b/apps/fo/app/pages/(with-layout)/flowRate/modal/page.tsx index 9f026430a..30b97c945 100644 --- a/apps/fo/app/pages/(with-layout)/flowRate/modal/page.tsx +++ b/apps/fo/app/pages/(with-layout)/flowRate/modal/page.tsx @@ -15,6 +15,7 @@ import type { ReturnType } from "../../../../components/common/FacilityTermModal import { roundUp } from "@/app/store/common"; import { roundNumber } from "@/app/components/common/DataForm"; import UnderComment from "@/app/components/common/UnderComment"; +import CommaToNumber from "@/app/components/common/CommaToNumber"; const tabList = [ { value: 'tab_term_year', label: '연간' }, @@ -186,11 +187,11 @@ export default function FlowRateModal(props: { fcltyName: string; facilityCd: st copyYearList.forEach((item) => { excelDownList.push({ "날짜": item.msrDt, - "총유입량(m³/일)": item.totInflAmnt, - "하수유입량(m³/일)": item.inflAmnt, - "연계처리량(m³/일)": item.sumFlow, - "총인반류수량(m³/일)": item.returnAmnt, - "방류량(m³/일)": item.efflAmnt, + "총유입량(m³/일)": CommaToNumber(item.totInflAmnt), + "하수유입량(m³/일)": CommaToNumber(item.inflAmnt), + "연계처리량(m³/일)": CommaToNumber(item.sumFlow), + "총인반류수량(m³/일)": CommaToNumber(item.returnAmnt), + "방류량(m³/일)": CommaToNumber(item.efflAmnt), /* "강우량(mm/일)": item.infoRnDay, */ }); }); diff --git a/apps/fo/app/pages/(with-layout)/flowRate/page.tsx b/apps/fo/app/pages/(with-layout)/flowRate/page.tsx index 750395cbd..5b53f51a2 100644 --- a/apps/fo/app/pages/(with-layout)/flowRate/page.tsx +++ b/apps/fo/app/pages/(with-layout)/flowRate/page.tsx @@ -7,12 +7,12 @@ "use client" import { useFoStore } from "@/app/store"; import type { TableUpperProps } from "@/app/store/common"; -import { ContentsDiv, downloadExcel, MainDiv, SearchBaseForm, SearchInput, SelectBox, Title, UiModal, UiTable, type ReturnType } from "@common/business_components"; +import type { ExcelType } from "@/app/store/flowRate"; +import { ContentsDiv, downloadExcelFormat, MainDiv, SearchBaseForm, SearchInput, SelectBox, Title, UiModal, UiTable, type ReturnType } from "@common/business_components"; import ListDiv from "@common/business_components/ui/list_div"; +import LoadingOverlay from "@common/business_components/ui/loadingBar"; import { useCallback, useEffect, useRef, useState } from "react"; import FlowRateModal from "./modal/page"; -import type { ExcelType } from "@/app/store/flowRate"; -import LoadingOverlay from "@common/business_components/ui/loadingBar"; export default function ProcessFacilitySearch() { const {Common @@ -140,7 +140,7 @@ export default function ProcessFacilitySearch() { useEffect(() => { if (excelList && excelList.length > 0) { - downloadExcel({ data: JSON.parse(JSON.stringify(excelList)), fileName: '시설별 유량현황', sheetNameArray: ['시설별 유량현황'], headerRange: 'A1:O1' }); + downloadExcelFormat({ data: JSON.parse(JSON.stringify(excelList)), fileName: '시설별 유량현황', sheetNameArray: ['시설별 유량현황'], headerRange: 'A1:O1', decimalArray0: [9,10,11,12,13,14] }); } else if (prevExcelListRef.current && prevExcelListRef.current.length > 0) { alert('다운받을 데이터가 없습니다.'); } diff --git a/apps/fo/app/pages/(with-layout)/processFacility/modal/page.tsx b/apps/fo/app/pages/(with-layout)/processFacility/modal/page.tsx index 8362a46d9..fbda7a140 100644 --- a/apps/fo/app/pages/(with-layout)/processFacility/modal/page.tsx +++ b/apps/fo/app/pages/(with-layout)/processFacility/modal/page.tsx @@ -5,10 +5,9 @@ */ "use client" -import { roundNumber } from "@/app/components/common/DataForm"; import { useFoStore } from "@/app/store"; import type { TableUpperProps } from "@/app/store/dashboard"; -import { downloadExcel, filePickedBlobArray, UITab, UiTable } from "@common/business_components/ui"; +import { downloadExcelFormat, filePickedBlobArray, UITab, UiTable } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { TabsContent @@ -137,12 +136,12 @@ export default function ProcessFacilityInfoModal(props: ModalType) { "준공일": item.cmplDt, "시운전완료일": item.trlrnCmplDt, "가동개시일": item.rnDt, - "시설용량(m³/일)": roundNumber(item.fctCpc,0), + "시설용량(m³/일)": item.fctCpc&&item.fctCpc.toString().trim()!=''?Number(item.fctCpc.toString().replaceAll(',','')):'', }); }); } if (excelDownList && excelDownList.length > 0) { - downloadExcel({ data: JSON.parse(JSON.stringify(excelDownList)), fileName: props.fcltyName + ' 시설이력관리', sheetNameArray: [props.fcltyName + ' 시설이력관리'], headerRange: 'A1:I1' }); + downloadExcelFormat({ data: JSON.parse(JSON.stringify(excelDownList)), fileName: props.fcltyName + ' 시설이력관리', sheetNameArray: [props.fcltyName + ' 시설이력관리'], headerRange: 'A1:I1' }); } else if (gridListFcltyHistInfo.length == 0) { alert('다운받을 데이터가 없습니다.'); } diff --git a/apps/fo/app/store/dashboard/index.tsx b/apps/fo/app/store/dashboard/index.tsx index 61f805ed5..906ce8e3b 100644 --- a/apps/fo/app/store/dashboard/index.tsx +++ b/apps/fo/app/store/dashboard/index.tsx @@ -53,9 +53,9 @@ export type planFcltyListProps = { export type OperationalStatusListProps = { flowRate : string, waterQlty : string, - yearAvg : number | string | '', - yearMax : number | string | '', - yearMin : number | string | '', + yearAvg : number | '', + yearMax : number | '', + yearMin : number | '', summerAll : number | string | '', summerThree : number | string | '', summerRain : number | string | '', @@ -1246,9 +1246,7 @@ const changeValue=(operationalStatus, data, keyTxt = 'INFL_AMNT')=>{ operationalStatus.winterSunnyAvg = data.winterSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN"))? data.winterSunny?Number(Math.round(data.winterSunny["AVG_" + keyTxt] * 1000) / 1000).toFixed(3).toString():'': data.winterSunny["AVG_" + keyTxt] : ''; operationalStatus.winterSunnyMax = data.winterSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN"))? data.winterSunny?Number(Math.round(data.winterSunny["MAX_" + keyTxt] * 1000) / 1000).toFixed(3).toString():'': data.winterSunny["MAX_" + keyTxt] : ''; // 지하수 - operationalStatus.groundWaterAvg = 10; - operationalStatus.groundWaterSummer = 11; - operationalStatus.groundWaterWinter = 12; + // 오염물질 // RDII 추정 = 하절기(6~8월) 중 최저 유입 BOD일때 유입유량 x ((동절기 청천시 유입BOD - 하절기(6~8월) 중 최저 유입BOD) / (동절기 청천시 유입BOD)) const summerLowFlow = data.summerBod && data.summerBod.INFL_AMNT && data.summerBod.INFL_AMNT != 'null' ? Number(data.summerBod.INFL_AMNT) : 0; diff --git a/apps/fo/app/store/facilityWaterQlty/index.tsx b/apps/fo/app/store/facilityWaterQlty/index.tsx index c60f72cd2..d0ddc6090 100644 --- a/apps/fo/app/store/facilityWaterQlty/index.tsx +++ b/apps/fo/app/store/facilityWaterQlty/index.tsx @@ -3,6 +3,7 @@ import DataForm, { roundNumber } from "@/app/components/common/DataForm"; import type { TableUpperProps } from "../dashboard"; import CalcRainEffect from "@/app/components/common/CalcRainEffect"; import { COD_YEAR } from "../common"; +import CommaToNumber from "@/app/components/common/CommaToNumber"; export type { TableUpperProps }; /**==================================== @@ -70,17 +71,17 @@ export interface ExcelType { 시군구: string, 시설이름: string, 주소: string, - "시설용량(m³/일)": number, - "유입BOD(mg/L)": string | '', - "유입TOC(mg/L)": string | '', - "유입SS(mg/L)": string | '', - "유입TN(mg/L)": string | '', - "유입TP(mg/L)": string | '', - "유출BOD(mg/L)": string | '', - "유출TOC(mg/L)": string | '', - "유출SS(mg/L)": string | '', - "유출TN(mg/L)": string | '', - "유출TP(mg/L)": string | '', + "시설용량(m³/일)": number | '', + "유입BOD(mg/L)": number | '', + "유입TOC(mg/L)": number | '', + "유입SS(mg/L)": number | '', + "유입TN(mg/L)": number | '', + "유입TP(mg/L)": number | '', + "유출BOD(mg/L)": number | '', + "유출TOC(mg/L)": number | '', + "유출SS(mg/L)": number | '', + "유출TN(mg/L)": number | '', + "유출TP(mg/L)": number | '', } /** @@ -104,17 +105,17 @@ export interface WaterQualityHistoryResponse { export type modalExcelType = { 날짜: string; - "유입BOD(mg/L)": string; - "유입TOC(COD)(mg/L)": string; - "유입SS(mg/L)": string; - "유입TN(mg/L)": string; - "유입TP(mg/L)": string; - "유출BOD(mg/L)": string; - "유출TOC(COD)(mg/L)": string; - "유출SS(mg/L)": string; - "유출TN(mg/L)": string; - "유출TP(mg/L)": string; - /* "강우량(mm/일)": string; */ + "유입BOD(mg/L)": number | ''; + "유입TOC(COD)(mg/L)": number | ''; + "유입SS(mg/L)": number | ''; + "유입TN(mg/L)": number | ''; + "유입TP(mg/L)": number | ''; + "유출BOD(mg/L)": number | ''; + "유출TOC(COD)(mg/L)": number | ''; + "유출SS(mg/L)": number | ''; + "유출TN(mg/L)": number | ''; + "유출TP(mg/L)": number | ''; + "강우량(mm/일)": number | ''; } /**==================================== @@ -486,17 +487,17 @@ export const facilityWaterQltyReducer = (set: (fn: (state: FacilityWaterQltyType 시군구: item.sggNm, 시설이름: item.bscFctNm, 주소: item.addr, - "시설용량(m³/일)": item.fctCpc, - "유입BOD(mg/L)": item.inflAssctBfrWqltBod, - "유입TOC(mg/L)": item.inflAssctBfrWqltToc, - "유입SS(mg/L)": item.inflAssctBfrWqltSs, - "유입TN(mg/L)": item.inflAssctBfrWqltTn, - "유입TP(mg/L)": item.inflAssctBfrWqltTp, - "유출BOD(mg/L)": item.efflWqltBod, - "유출TOC(mg/L)": item.efflWqltToc, - "유출SS(mg/L)": item.efflWqltSs, - "유출TN(mg/L)": item.efflWqltTn, - "유출TP(mg/L)": item.efflWqltTp, + "시설용량(m³/일)": CommaToNumber(item.fctCpc), + "유입BOD(mg/L)": CommaToNumber(item.inflAssctBfrWqltBod), + "유입TOC(mg/L)": CommaToNumber(item.inflAssctBfrWqltToc), + "유입SS(mg/L)": CommaToNumber(item.inflAssctBfrWqltSs), + "유입TN(mg/L)": CommaToNumber(item.inflAssctBfrWqltTn), + "유입TP(mg/L)": CommaToNumber(item.inflAssctBfrWqltTp), + "유출BOD(mg/L)": CommaToNumber(item.efflWqltBod), + "유출TOC(mg/L)": CommaToNumber(item.efflWqltToc), + "유출SS(mg/L)": CommaToNumber(item.efflWqltSs), + "유출TN(mg/L)": CommaToNumber(item.efflWqltTn), + "유출TP(mg/L)": CommaToNumber(item.efflWqltTp), }); }); }else{ diff --git a/apps/fo/app/store/flowRate/index.tsx b/apps/fo/app/store/flowRate/index.tsx index ab9100d09..05a41e556 100644 --- a/apps/fo/app/store/flowRate/index.tsx +++ b/apps/fo/app/store/flowRate/index.tsx @@ -3,6 +3,7 @@ import type { TableUpperProps } from "../dashboard"; import DataForm, { roundNumber } from "@/app/components/common/DataForm"; import CalcRainEffect from "@/app/components/common/CalcRainEffect"; import { fetchFacilityWaterQltyListHist } from "../facilityWaterQlty"; +import CommaToNumber from "@/app/components/common/CommaToNumber"; /**==================================== * Store - 타입 @@ -300,11 +301,11 @@ export const flowRateSearchReducer:(set:(fn: (state: FlowRateSearchType) => Flow 시설이름: item.bscFctNm, 주소: item.daddr, "시설용량(m³/일)": item.fctCpc, - "총유입량(m³/일)": item.totInflAmnt, - "하수유입량(m³/일)": item.inflAmnt, - "연계처리량(m³/일)": item.sumFlow, - "총인반류수량(m³/일)": item.returnAmnt, - "방류량(m³/일)": item.efflAmnt, + "총유입량(m³/일)": CommaToNumber(item.totInflAmnt), + "하수유입량(m³/일)": CommaToNumber(item.inflAmnt), + "연계처리량(m³/일)": CommaToNumber(item.sumFlow), + "총인반류수량(m³/일)": CommaToNumber(item.returnAmnt), + "방류량(m³/일)": CommaToNumber(item.efflAmnt), }); }); } diff --git a/packages/common/business_components/src/ui/excel/index.tsx b/packages/common/business_components/src/ui/excel/index.tsx index cbe77293b..aedb32256 100644 --- a/packages/common/business_components/src/ui/excel/index.tsx +++ b/packages/common/business_components/src/ui/excel/index.tsx @@ -6,6 +6,10 @@ type ExcelDownloadProps = { fileName: string; sheetNameArray: string[]; headerRange?: string; + decimalArray0? : number[]; + decimalArray1? : number[]; + decimalArray2? : number[]; + decimalArray3? : number[]; } export const downloadExcel = ({ data, fileName = new Date().getTime().toString() + '.xlsx', sheetNameArray = ["Sheet1"], headerRange='A1:V3'}: ExcelDownloadProps) => { @@ -15,6 +19,45 @@ export const downloadExcel = ({ data, fileName = new Date().getTime().toString() excelStyle(XLSX.write(workbook, { bookType: "xlsx", type: "buffer" }), headerRange, fileName); }; +export const downloadExcelFormat = ({ data, fileName = new Date().getTime().toString() + '.xlsx', sheetNameArray = ["Sheet1"], headerRange='A1:V3', decimalArray0=[], decimalArray1=[], decimalArray2=[], decimalArray3=[]}: ExcelDownloadProps) => { + const worksheet = XLSX.utils.json_to_sheet(Array.isArray(data) ? data : [data]); + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, sheetNameArray[0]); + console.log('decimalArray0 : ', decimalArray0); + const headerEnd = XLSX.utils.decode_range(headerRange).e.r; // 0-based index + const startRow = headerEnd + 1; + + // 🔹 전체 범위 + const range = XLSX.utils.decode_range(worksheet["!ref"] as string); + + const chaneValue = (array: number[], decimal: number) => { + for (let row = startRow; row <= range.e.r; row++) { + if(array.length>0){ + for(let idx=0; idx