This commit is contained in:
ylj20011123 2025-10-20 18:44:48 +08:00
parent d7338647f1
commit f3703b1f81
40 changed files with 762 additions and 611 deletions

View File

@ -12,6 +12,7 @@ import useRequest from "@ahooksjs/use-request";
import { handleGetEndaccountHisList, handleGetServiceShopList } from "../service"; import { handleGetEndaccountHisList, handleGetServiceShopList } from "../service";
import { getFieldEnumTreeNoSession } from "@/services/options"; import { getFieldEnumTreeNoSession } from "@/services/options";
import moment from 'moment' import moment from 'moment'
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
const HistoricalAccounting: React.FC<{ currentUser: CurrentUser }> = (props) => { const HistoricalAccounting: React.FC<{ currentUser: CurrentUser }> = (props) => {
@ -413,27 +414,29 @@ const HistoricalAccounting: React.FC<{ currentUser: CurrentUser }> = (props) =>
}} }}
toolbar={{ toolbar={{
actions: [ actions: [
<span style={{ visibility: 'hidden' }}> // <span style={{ visibility: 'hidden' }}>
<ReactHTMLTableToExcel // <ReactHTMLTableToExcel
buttonText={'导出excel'} // buttonText={'导出excel'}
ref={downloadBtnRef} // ref={downloadBtnRef}
table="table-to-xls-HistoricalAccounting" // table="table-to-xls-HistoricalAccounting"
filename={`历史账期导出表${searchParams?.StartDate}-${searchParams?.EndDate}`} // filename={`历史账期导出表${searchParams?.StartDate}-${searchParams?.EndDate}`}
sheet="sheet1" // sheet="sheet1"
/> // />
</span>, // </span>,
<Button <Button
key="new" key="new"
type="primary" type="primary"
onClick={(e) => { onClick={(e) => {
if (reqDetailList && reqDetailList.length > 0) { if (reqDetailList && reqDetailList.length > 0) {
setShowLoading(true) exportXlsxFromProColumnsExcelJS(columns,
setTimeout(() => { reqDetailList,
setShowExportTable(true) `历史账期导出表${searchParams?.StartDate}-${searchParams?.EndDate}`,
setTimeout(() => { {
exportTable(e) footerMaker: currentUser?.Name,
}, 100) footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
}, 100) footerStatsTime: `${searchParams?.StartDate}-${searchParams?.EndDate}`
}
)
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')
} }

View File

@ -934,6 +934,9 @@ const InventoryCategory: React.FC<{ currentUser: CurrentUser }> = (props) => {
`进销存类别报表${searchParams?.InventoryTime ? searchParams?.InventoryTime.split('-')[1] : ""}`, `进销存类别报表${searchParams?.InventoryTime ? searchParams?.InventoryTime.split('-')[1] : ""}`,
{ {
topTitle: `进销存类别报表`, // 顶部大标题 topTitle: `进销存类别报表`, // 顶部大标题
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
} }
) )
} else { } else {

View File

@ -1103,6 +1103,9 @@ const InventoryDetails: React.FC<{ currentUser: CurrentUser, isComponents?: any,
{ {
topTitle: `${currentShopInfo?.SERVERPART_NAME}${currentShopInfo?.SHOPNAME}进销存报表`, // 顶部大标题 topTitle: `${currentShopInfo?.SERVERPART_NAME}${currentShopInfo?.SHOPNAME}进销存报表`, // 顶部大标题
infoRowLeft: `统计方式:按成本结算(${currentDataType === '1' ? '含税' : '除税'})`,//左侧文字 infoRowLeft: `统计方式:按成本结算(${currentDataType === '1' ? '含税' : '除税'})`,//左侧文字
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
} }
) )
} else { } else {

View File

@ -521,6 +521,9 @@ const inventoryInformation: React.FC<{ currentUser: CurrentUser }> = (props) =>
`库存信息统计表`, `库存信息统计表`,
{ {
topTitle: `库存信息统计表`, // 顶部大标题 topTitle: `库存信息统计表`, // 顶部大标题
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
} }
) )
} else { } else {

View File

@ -21,7 +21,7 @@ import Draggable from "react-draggable";
import InventoryDetails from "../InventoryDetails"; import InventoryDetails from "../InventoryDetails";
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun"; import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
import { formatTreeData } from "@/utils/format"; import { formatTreeData } from "@/utils/format";
import moment from 'moment'
const oneProductMultipleSizes: React.FC<{ currentUser: CurrentUser }> = (props) => { const oneProductMultipleSizes: React.FC<{ currentUser: CurrentUser }> = (props) => {
const { currentUser } = props const { currentUser } = props
@ -979,6 +979,9 @@ const oneProductMultipleSizes: React.FC<{ currentUser: CurrentUser }> = (props)
`一品多码统计表`, `一品多码统计表`,
{ {
topTitle: `一品多码统计表`, // 顶部大标题 topTitle: `一品多码统计表`, // 顶部大标题
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
} }
) )
} else { } else {

View File

@ -589,6 +589,9 @@ const purchaseReceiving: React.FC<{ currentUser: CurrentUser }> = (props) => {
`入库退货统计表${searchParams?.StartDate}-${searchParams?.EndDate}`, `入库退货统计表${searchParams?.StartDate}-${searchParams?.EndDate}`,
{ {
topTitle: `入库退货统计表`, // 顶部大标题 topTitle: `入库退货统计表`, // 顶部大标题
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.StartDate}-${searchParams?.EndDate}`
} }
) )
} else { } else {

View File

@ -367,6 +367,9 @@ const returnProcess: React.FC<{ currentUser: CurrentUser }> = (props) => {
`退货流程统计${searchParams?.CREATEDATE_Start}-${searchParams?.CREATEDATE_End}`, `退货流程统计${searchParams?.CREATEDATE_Start}-${searchParams?.CREATEDATE_End}`,
{ {
topTitle: `退货流程统计表`, // 顶部大标题 topTitle: `退货流程统计表`, // 顶部大标题
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
} }
) )
} else { } else {

View File

@ -21,7 +21,7 @@ import { handleNewGetSERVERPARTDetail } from "@/pages/newDataAnalysis/service";
import { handleGetCASHWORKERDetail, handleGetServerpartShopList, handleSynchroCASHWORKER } from "@/pages/newDataAnalysis/serviceAreaPersonnel/service"; import { handleGetCASHWORKERDetail, handleGetServerpartShopList, handleSynchroCASHWORKER } from "@/pages/newDataAnalysis/serviceAreaPersonnel/service";
import { formatTreeData } from "@/utils/format"; import { formatTreeData } from "@/utils/format";
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun"; import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
import moment from 'moment'
const servicePartAudit: React.FC<{ currentUser: CurrentUser }> = (props) => { const servicePartAudit: React.FC<{ currentUser: CurrentUser }> = (props) => {
const { currentUser } = props const { currentUser } = props
@ -345,9 +345,11 @@ const servicePartAudit: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`服务区稽核人员管理统计`, `服务区稽核人员管理统计`,
// { {
// topTitle: `库存信息统计表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -473,6 +473,9 @@ const shopProcurement: React.FC<{ currentUser: CurrentUser }> = (props) => {
`商品入库统计表${searchParams?.RECEIVECENTER_DATE_Start}-${searchParams?.RECEIVECENTER_DATE_End}`, `商品入库统计表${searchParams?.RECEIVECENTER_DATE_Start}-${searchParams?.RECEIVECENTER_DATE_End}`,
{ {
topTitle: `商品入库统计表`, // 顶部大标题 topTitle: `商品入库统计表`, // 顶部大标题
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
} }
) )
} else { } else {

View File

@ -22,7 +22,7 @@ import { handleAddUpdate, handleDelete, handleGetBrandList } from "./service";
import { getList as handleGetTradeList } from '../BusinessTrade/service' import { getList as handleGetTradeList } from '../BusinessTrade/service'
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun"; import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
import { formatTreeData } from "@/utils/format"; import { formatTreeData } from "@/utils/format";
import moment from 'moment'
const operatingBrand: React.FC<{ currentUser: CurrentUser }> = (props) => { const operatingBrand: React.FC<{ currentUser: CurrentUser }> = (props) => {
const { currentUser } = props const { currentUser } = props
@ -445,7 +445,9 @@ const operatingBrand: React.FC<{ currentUser: CurrentUser }> = (props) => {
reqDetailList, reqDetailList,
`经营品牌列表`, `经营品牌列表`,
{ {
// topTitle: `退货流程统计表`, // 顶部大标题 footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
} }
) )
} else { } else {

View File

@ -328,9 +328,11 @@ const serviceArea: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`服务区门店统计表`, `服务区门店统计表`,
// { {
// topTitle: `库存信息统计表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -20,7 +20,7 @@ import session from "@/utils/session";
import { formatTreeData } from "@/utils/format"; import { formatTreeData } from "@/utils/format";
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun"; import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
import { handleNewGetSERVERPARTDetail } from "../service"; import { handleNewGetSERVERPARTDetail } from "../service";
import moment from 'moment'
const serviceAreaPersonnel: React.FC<{ currentUser: CurrentUser }> = (props) => { const serviceAreaPersonnel: React.FC<{ currentUser: CurrentUser }> = (props) => {
const { currentUser } = props const { currentUser } = props
@ -344,9 +344,11 @@ const serviceAreaPersonnel: React.FC<{ currentUser: CurrentUser }> = (props) =>
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`服务区人员管理统计`, `服务区人员管理统计`,
// { {
// topTitle: `库存信息统计表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -1129,6 +1129,9 @@ const RevenueSummaryTable: React.FC<{ currentUser?: CurrentUser }> = (props) =>
`营收汇总报表${searchParamsTime?.StartDate}-${searchParamsTime?.EndDate}`, `营收汇总报表${searchParamsTime?.StartDate}-${searchParamsTime?.EndDate}`,
{ {
// topTitle: `营收汇总报表`, // 顶部大标题 // topTitle: `营收汇总报表`, // 顶部大标题
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParamsTime?.StartDate}-${searchParamsTime?.EndDate}`
} }
) )
} else { } else {

View File

@ -469,9 +469,11 @@ const personSellReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`服务区收银员报表${searchParams?.SELL_ENDDATE_Start}-${searchParams?.SELL_ENDDATE_End}`, `服务区收银员报表${searchParams?.SELL_ENDDATE_Start}-${searchParams?.SELL_ENDDATE_End}`,
// { {
// topTitle: `单品销售排行统计`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.SELL_ENDDATE_Start}-${searchParams?.SELL_ENDDATE_End}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -84,7 +84,7 @@ const revenueQOQReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
// }, // },
{ {
title: '服务区名称', title: '服务区名称',
width: 170, width: 250,
dataIndex: 'Name', dataIndex: 'Name',
align: 'center', align: 'center',
ellipsis: true, ellipsis: true,
@ -605,9 +605,11 @@ const revenueQOQReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`销售同/环比分析表_${searchParams?.StartDate}-${searchParams?.EndDate}`, `销售同/环比分析表_${searchParams?.StartDate}-${searchParams?.EndDate}`,
// { {
// topTitle: `历史销售单品报表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.StartDate}-${searchParams?.EndDate}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -684,9 +684,11 @@ const revenueYOYQOQReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`销售同环比分析_${searchParams?.StartDate}-${searchParams?.EndDate}`, `销售同环比分析_${searchParams?.StartDate}-${searchParams?.EndDate}`,
// { {
// topTitle: `历史销售单品报表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.StartDate}-${searchParams?.EndDate}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -386,9 +386,11 @@ const saleFlow: React.FC<{ currentUser: CurrentUser | undefined }> = (props) =>
reqDetailList, reqDetailList,
// `销售流水查询${searchParams?.SELLMASTER_DATE}`, // `销售流水查询${searchParams?.SELLMASTER_DATE}`,
`销售流水查询${searchParams?.SELLMASTER_DATE_Start}-${searchParams?.SELLMASTER_DATE_End}`, `销售流水查询${searchParams?.SELLMASTER_DATE_Start}-${searchParams?.SELLMASTER_DATE_End}`,
// { {
// topTitle: `单品销售排行统计`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.SELLMASTER_DATE_Start}-${searchParams?.SELLMASTER_DATE_End}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -415,6 +415,9 @@ const saleHisReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
`历史销售单品报表${searchParams?.StartTime}-${searchParams?.EndTime}`, `历史销售单品报表${searchParams?.StartTime}-${searchParams?.EndTime}`,
{ {
topTitle: `历史销售单品报表`, // 顶部大标题 topTitle: `历史销售单品报表`, // 顶部大标题
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.StartTime}-${searchParams?.EndTime}`
} }
) )
} else { } else {

View File

@ -439,9 +439,12 @@ const saleRankReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`商品销售排名${searchParams?.startDate}-${searchParams?.endDate}`, `商品销售排名${searchParams?.startDate}-${searchParams?.endDate}`,
// { {
// topTitle: `单品销售排行统计`, // 顶部大标题 // topTitle: `单品销售排行统计`, // 顶部大标题
// } footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.startDate}-${searchParams?.endDate}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -477,6 +477,9 @@ const saleReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
`单品统计报表${searchParams?.StartTime}-${searchParams?.EndTime}`, `单品统计报表${searchParams?.StartTime}-${searchParams?.EndTime}`,
{ {
topTitle: `单品统计报表`, // 顶部大标题 topTitle: `单品统计报表`, // 顶部大标题
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.StartTime}-${searchParams?.EndTime}`
} }
) )
} else { } else {

View File

@ -382,9 +382,12 @@ const saleTypeHisReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`类别统计报表${searchParams?.startDate}-${searchParams?.endDate}`, `类别统计报表${searchParams?.startDate}-${searchParams?.endDate}`,
// { {
// topTitle: `历史销售单品报表`, // 顶部大标题 // topTitle: `历史销售单品报表`, // 顶部大标题
// } footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.startDate}-${searchParams?.endDate}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -398,7 +398,9 @@ const saleReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
reqDetailList, reqDetailList,
`销售类别报表${searchParams?.startDate}-${searchParams?.endDate}`, `销售类别报表${searchParams?.startDate}-${searchParams?.endDate}`,
{ {
footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
// topTitle: `营收汇总报表`, // 顶部大标题 // topTitle: `营收汇总报表`, // 顶部大标题
} }
) )

View File

@ -589,9 +589,12 @@ const transactionAnalysis: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`客单交易分析${searchParams?.StartDate}-${searchParams?.EndDate}`, `客单交易分析${searchParams?.StartDate}-${searchParams?.EndDate}`,
// { {
// topTitle: `历史销售单品报表`, // 顶部大标题 // topTitle: `历史销售单品报表`, // 顶部大标题
// } footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.StartDate}-${searchParams?.EndDate}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -201,7 +201,7 @@ const abnormalAmount: React.FC<{ currentUser: CurrentUser }> = (props) => {
const req = { const req = {
ProvinceCode: currentUser?.ProvinceCode, ProvinceCode: currentUser?.ProvinceCode,
ServerpartId: id, ServerpartId: id,
ShowWholePower: true // ShowWholePower: true
} }
const data = await handleGetServerpartShopDDL(req) const data = await handleGetServerpartShopDDL(req)
console.log('data', data) console.log('data', data)
@ -323,7 +323,7 @@ const abnormalAmount: React.FC<{ currentUser: CurrentUser }> = (props) => {
<LeftSelectTree setSelectedId={setSelectedId} setCollapsible={setCollapsible} collapsible={collapsible} otherFun={(info: any) => { <LeftSelectTree setSelectedId={setSelectedId} setCollapsible={setCollapsible} collapsible={collapsible} otherFun={(info: any) => {
const selectedIds = info.checkedNodes.filter(n => n?.type === 1) const selectedIds = info.checkedNodes.filter(n => n?.type === 1)
if (selectedIds.map(n => n?.value)?.toString().indexOf(',') === -1) { if (selectedIds.map(n => n?.value)?.toString().indexOf(',') === -1) {
handleGetShopList(selectedIds) handleGetShopList(selectedIds.map(n => n?.value)?.toString() || '')
} else { } else {
setServerpartShopObj({}) setServerpartShopObj({})
} }
@ -399,9 +399,11 @@ const abnormalAmount: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`销售金额异常${searchParams?.Start_Date}-${searchParams?.End_Date}`, `销售金额异常${searchParams?.Start_Date}-${searchParams?.End_Date}`,
// { {
// topTitle: `库存信息统计表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -17,6 +17,7 @@ import moment from "moment";
import { handleGetABNORMALAUDITList } from "@/pages/reports/audit/abnormalAudit/service"; import { handleGetABNORMALAUDITList } from "@/pages/reports/audit/abnormalAudit/service";
import PageTitleBox from "@/components/PageTitleBox"; import PageTitleBox from "@/components/PageTitleBox";
import LeftSelectTree from "../../settlementAccount/component/leftSelectTree"; import LeftSelectTree from "../../settlementAccount/component/leftSelectTree";
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
const abnormalAudit: React.FC<{ currentUser: CurrentUser }> = (props) => { const abnormalAudit: React.FC<{ currentUser: CurrentUser }> = (props) => {
@ -331,27 +332,29 @@ const abnormalAudit: React.FC<{ currentUser: CurrentUser }> = (props) => {
}} }}
toolbar={{ toolbar={{
actions: [ actions: [
<span style={{ visibility: 'hidden' }}> // <span style={{ visibility: 'hidden' }}>
<ReactHTMLTableToExcel // <ReactHTMLTableToExcel
buttonText={'导出excel'} // buttonText={'导出excel'}
ref={downloadBtnRef} // ref={downloadBtnRef}
table="table-to-xls-abnormalAudit" // table="table-to-xls-abnormalAudit"
filename={`单品销售排行统计${searchParams?.CHECK_STARTDATE_SEARCH}-${searchParams?.CHECK_ENDDATE_SEARCH}`} // filename={`单品销售排行统计${searchParams?.CHECK_STARTDATE_SEARCH}-${searchParams?.CHECK_ENDDATE_SEARCH}`}
sheet="sheet1" // sheet="sheet1"
/> // />
</span>, // </span>,
<Button <Button
key="new" key="new"
type="primary" type="primary"
onClick={(e) => { onClick={(e) => {
if (reqDetailList && reqDetailList.length > 0) { if (reqDetailList && reqDetailList.length > 0) {
setShowLoading(true) exportXlsxFromProColumnsExcelJS(columns,
setTimeout(() => { reqDetailList,
setShowExportTable(true) `单品销售排行统计${searchParams?.CHECK_STARTDATE_SEARCH}-${searchParams?.CHECK_ENDDATE_SEARCH}`,
setTimeout(() => { {
exportTable(e) footerMaker: currentUser?.Name,
}, 100) footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
}, 100) footerStatsTime: `${searchParams?.CHECK_STARTDATE_SEARCH}-${searchParams?.CHECK_ENDDATE_SEARCH}`
}
)
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')
} }

View File

@ -216,7 +216,7 @@ const abnormalExamine: React.FC<{ currentUser: CurrentUser }> = (props) => {
const req = { const req = {
ProvinceCode: currentUser?.ProvinceCode, ProvinceCode: currentUser?.ProvinceCode,
ServerpartId: id, ServerpartId: id,
ShowWholePower: true // ShowWholePower: true
} }
const data = await handleGetServerpartShopDDL(req) const data = await handleGetServerpartShopDDL(req)
const obj: any = {} const obj: any = {}
@ -333,7 +333,7 @@ const abnormalExamine: React.FC<{ currentUser: CurrentUser }> = (props) => {
<LeftSelectTree setSelectedId={setSelectedId} setCollapsible={setCollapsible} collapsible={collapsible} otherFun={(info: any) => { <LeftSelectTree setSelectedId={setSelectedId} setCollapsible={setCollapsible} collapsible={collapsible} otherFun={(info: any) => {
const selectedIds = info.checkedNodes.filter(n => n?.type === 1) const selectedIds = info.checkedNodes.filter(n => n?.type === 1)
if (selectedIds.map(n => n?.value)?.toString().indexOf(',') === -1) { if (selectedIds.map(n => n?.value)?.toString().indexOf(',') === -1) {
handleGetShopList(selectedIds) handleGetShopList(selectedIds.map(n => n?.value)?.toString() || '')
} else { } else {
setServerpartShopObj({}) setServerpartShopObj({})
} }
@ -405,9 +405,11 @@ const abnormalExamine: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`稽核联动查询表${searchParams?.Start_Date}-${searchParams?.End_Date}`, `稽核联动查询表${searchParams?.Start_Date}-${searchParams?.End_Date}`,
// { {
// topTitle: `库存信息统计表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.Start_Date}-${searchParams?.End_Date}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -435,9 +435,11 @@ const abnormalReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`单品统计报表${searchParams?.startDate}-${searchParams?.endDate}`, `单品统计报表${searchParams?.startDate}-${searchParams?.endDate}`,
// { {
// topTitle: `进销存类别报表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -201,8 +201,10 @@ const abnormalSale: React.FC<{ currentUser: CurrentUser }> = (props) => {
const req = { const req = {
ProvinceCode: currentUser?.ProvinceCode, ProvinceCode: currentUser?.ProvinceCode,
ServerpartId: id, ServerpartId: id,
ShowWholePower: true // ShowWholePower: true
} }
console.log('reqreqreqreq', req);
const data = await handleGetServerpartShopDDL(req) const data = await handleGetServerpartShopDDL(req)
console.log('data', data) console.log('data', data)
const obj: any = {} const obj: any = {}
@ -323,7 +325,7 @@ const abnormalSale: React.FC<{ currentUser: CurrentUser }> = (props) => {
<LeftSelectTree setSelectedId={setSelectedId} setCollapsible={setCollapsible} collapsible={collapsible} otherFun={(info: any) => { <LeftSelectTree setSelectedId={setSelectedId} setCollapsible={setCollapsible} collapsible={collapsible} otherFun={(info: any) => {
const selectedIds = info.checkedNodes.filter(n => n?.type === 1) const selectedIds = info.checkedNodes.filter(n => n?.type === 1)
if (selectedIds.map(n => n?.value)?.toString().indexOf(',') === -1) { if (selectedIds.map(n => n?.value)?.toString().indexOf(',') === -1) {
handleGetShopList(selectedIds) handleGetShopList(selectedIds.map(n => n?.value)?.toString() || '')
} else { } else {
setServerpartShopObj({}) setServerpartShopObj({})
} }
@ -400,9 +402,11 @@ const abnormalSale: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`销售过程异常${searchParams?.Start_Date}-${searchParams?.End_Date}`, `销售过程异常${searchParams?.Start_Date}-${searchParams?.End_Date}`,
// { {
// topTitle: `库存信息统计表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -581,9 +581,11 @@ const checkAccountReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`稽核情况汇总表${searchParams?.startDate}-${searchParams?.endDate}`, `稽核情况汇总表${searchParams?.startDate}-${searchParams?.endDate}`,
// { {
// topTitle: `进销存类别报表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.startDate}-${searchParams?.endDate}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -412,9 +412,11 @@ const checkAcount: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`现场稽核管理${searchParams?.Start_Date}-${searchParams?.End_Date}`, `现场稽核管理${searchParams?.Start_Date}-${searchParams?.End_Date}`,
// { {
// topTitle: `进销存类别报表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.Start_Date}-${searchParams?.End_Date}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -276,12 +276,14 @@ const List: React.FC<{ currentUser?: CurrentUser }> = ({ currentUser }) => {
const handleGetShopList = async (e: any) => { const handleGetShopList = async (e: any) => {
setSelectServicePartId(e) setSelectServicePartId(e)
const req = { const req = {
ProvinceCode: currentUser?.USER_PROVINCE, ProvinceCode: currentUser?.ProvinceCode,
ServerpartId: e, ServerpartId: e,
ShowWholePower: true // ShowWholePower: true
} }
const data = await handleGetServiceShopList(req) const data = await handleGetServiceShopList(req)
setSelectShopId(null) setSelectShopId(null)
console.log('data.Listdata.Listdata.Listdata.List', data.List);
setShopList(data.List) setShopList(data.List)
} }

View File

@ -18,6 +18,7 @@ import * as numeral from "numeral";
import ProDescriptions from "@ant-design/pro-descriptions"; import ProDescriptions from "@ant-design/pro-descriptions";
import PageTitleBox from "@/components/PageTitleBox"; import PageTitleBox from "@/components/PageTitleBox";
import LeftSelectTree from "../../settlementAccount/component/leftSelectTree"; import LeftSelectTree from "../../settlementAccount/component/leftSelectTree";
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
const curDailyReport: React.FC<{ currentUser: CurrentUser }> = (props) => { const curDailyReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
@ -415,27 +416,36 @@ const curDailyReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
}} }}
toolbar={{ toolbar={{
actions: [ actions: [
<span style={{ visibility: 'hidden' }}> // <span style={{ visibility: 'hidden' }}>
<ReactHTMLTableToExcel // <ReactHTMLTableToExcel
buttonText={'导出excel'} // buttonText={'导出excel'}
ref={downloadBtnRef} // ref={downloadBtnRef}
table="table-to-xls-curDailyReport" // table="table-to-xls-curDailyReport"
filename={`当日营收报表${moment().format('YYYY-MM-DD')}`} // filename={`当日营收报表${moment().format('YYYY-MM-DD')}`}
sheet="sheet1" // sheet="sheet1"
/> // />
</span>, // </span>,
<Button <Button
key="new" key="new"
type="primary" type="primary"
onClick={(e) => { onClick={(e) => {
if (reqDetailList && reqDetailList.length > 0) { if (reqDetailList && reqDetailList.length > 0) {
setShowLoading(true) exportXlsxFromProColumnsExcelJS(columns,
setTimeout(() => { reqDetailList,
setShowExportTable(true) `当日营收报表${moment().format('YYYY-MM-DD')}`,
setTimeout(() => { {
exportTable(e) footerMaker: currentUser?.Name,
}, 100) footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
}, 100) footerStatsTime: `${moment().format('YYYY-MM-DD')}`
}
)
// setShowLoading(true)
// setTimeout(() => {
// setShowExportTable(true)
// setTimeout(() => {
// exportTable(e)
// }, 100)
// }, 100)
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')
} }

View File

@ -17,6 +17,7 @@ import moment from "moment";
import * as numeral from "numeral"; import * as numeral from "numeral";
import ProDescriptions from "@ant-design/pro-descriptions"; import ProDescriptions from "@ant-design/pro-descriptions";
import PageTitleBox from "@/components/PageTitleBox"; import PageTitleBox from "@/components/PageTitleBox";
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
const curVerify: React.FC<{ currentUser: CurrentUser }> = (props) => { const curVerify: React.FC<{ currentUser: CurrentUser }> = (props) => {
@ -399,13 +400,15 @@ const curVerify: React.FC<{ currentUser: CurrentUser }> = (props) => {
type="primary" type="primary"
onClick={(e) => { onClick={(e) => {
if (reqDetailList && reqDetailList.length > 0) { if (reqDetailList && reqDetailList.length > 0) {
setShowLoading(true) exportXlsxFromProColumnsExcelJS(columns,
setTimeout(() => { reqDetailList,
setShowExportTable(true) `实时稽查校验表${searchParams?.StartDate}-${searchParams?.EndDate}`,
setTimeout(() => { {
exportTable(e) footerMaker: currentUser?.Name,
}, 100) footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
}, 100) footerStatsTime: `${searchParams?.StartDate}-${searchParams?.EndDate}`
}
)
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')
} }

View File

@ -18,6 +18,7 @@ import AuditDetail from "@/pages/DataVerification/list/components/auditDetail";
import upload from '@/assets/upload.png' import upload from '@/assets/upload.png'
import PageTitleBox from "@/components/PageTitleBox"; import PageTitleBox from "@/components/PageTitleBox";
import LeftSelectTree from "../../settlementAccount/component/leftSelectTree"; import LeftSelectTree from "../../settlementAccount/component/leftSelectTree";
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
const checkAcount: React.FC<{ currentUser: CurrentUser }> = (props) => { const checkAcount: React.FC<{ currentUser: CurrentUser }> = (props) => {
@ -401,13 +402,15 @@ const checkAcount: React.FC<{ currentUser: CurrentUser }> = (props) => {
type="primary" type="primary"
onClick={(e) => { onClick={(e) => {
if (reqDetailList && reqDetailList.length > 0) { if (reqDetailList && reqDetailList.length > 0) {
setShowLoading(true) exportXlsxFromProColumnsExcelJS(columns,
setTimeout(() => { reqDetailList,
setShowExportTable(true) `现场稽核反馈表${searchParams?.CHECK_STARTDATE}-${searchParams?.CHECK_ENDDATE}`,
setTimeout(() => { {
exportTable(e) footerMaker: currentUser?.Name,
}, 100) footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
}, 100) footerStatsTime: `${searchParams?.CHECK_STARTDATE}-${searchParams?.CHECK_ENDDATE}`
}
)
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')
} }

View File

@ -441,9 +441,11 @@ const spAbnormalReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`异常稽查报表${searchParams?.startDate}-${searchParams?.endDate}`, `异常稽查报表${searchParams?.startDate}-${searchParams?.endDate}`,
// { {
// topTitle: `进销存类别报表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.startDate}-${searchParams?.endDate}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -356,9 +356,11 @@ const specialReport: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`特殊行为占比${searchParams?.startDate}-${searchParams?.endDate}`, `特殊行为占比${searchParams?.startDate}-${searchParams?.endDate}`,
// { {
// topTitle: `进销存类别报表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.startDate}-${searchParams?.endDate}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -483,9 +483,12 @@ const commoditySearch: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`商品信息查询表`, `商品信息查询表`,
// { {
// topTitle: `库存信息统计表`, // 顶部大标题 // topTitle: `库存信息统计表`, // 顶部大标题
// } footerMaker: currentUser?.Name,
footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -24,6 +24,7 @@ import PageTitleBox from "@/components/PageTitleBox";
import session from "@/utils/session"; import session from "@/utils/session";
import { formatTreeData } from "@/utils/format"; import { formatTreeData } from "@/utils/format";
import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun"; import { exportXlsxFromProColumnsExcelJS } from "@/utils/exportExcelFun";
import moment from 'moment'
const hotkeyset: React.FC<{ currentUser: CurrentUser }> = (props) => { const hotkeyset: React.FC<{ currentUser: CurrentUser }> = (props) => {
@ -431,9 +432,11 @@ const hotkeyset: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`商品快捷键管理报表`, `商品快捷键管理报表`,
// { {
// topTitle: `库存信息统计表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: ""
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -389,9 +389,11 @@ const shopCommodity: React.FC<{ currentUser: CurrentUser }> = (props) => {
exportXlsxFromProColumnsExcelJS(columns, exportXlsxFromProColumnsExcelJS(columns,
reqDetailList, reqDetailList,
`门店商品查询${searchParams?.OperateDate_Start}-${searchParams?.OperateDate_End}`, `门店商品查询${searchParams?.OperateDate_Start}-${searchParams?.OperateDate_End}`,
// { {
// topTitle: `库存信息统计表`, // 顶部大标题 footerMaker: currentUser?.Name,
// } footerMakerTime: moment().format('YYYY-MM-DD HH:mm:ss'),
footerStatsTime: `${searchParams?.OperateDate_Start}-${searchParams?.OperateDate_End}`
}
) )
} else { } else {
message.error('暂无数据可导出!') message.error('暂无数据可导出!')

View File

@ -185,11 +185,16 @@ export async function exportXlsxFromProColumnsExcelJS(
options?: { options?: {
sheetName?: string; sheetName?: string;
chunkSize?: number; chunkSize?: number;
topTitle?: string; // 顶部大标题(整表合并 + 居中) topTitle?: string;
infoRowLeft?: string; // 标题下插入的左侧文字 infoRowLeft?: string;
infoRowRight?: string; // 标题下插入的右侧文字(右对齐) infoRowRight?: string;
freezeHeader?: boolean; // 冻结到哪一行(自动计算 freezeHeader?: boolean; // 已保留但默认不再生效(不触发冻结)
childrenKey?: string; childrenKey?: string;
// 底部信息
footerMaker?: any;
footerMakerTime?: any;
footerStatsTime?: any;
} }
) { ) {
const { const {
@ -198,11 +203,14 @@ export async function exportXlsxFromProColumnsExcelJS(
topTitle, topTitle,
infoRowLeft, infoRowLeft,
infoRowRight, infoRowRight,
freezeHeader = true, // 为兼容外部调用保留字段,但默认不做冻结以满足你的要求
freezeHeader = false,
childrenKey = 'children', childrenKey = 'children',
footerMaker,
footerMakerTime,
footerStatsTime,
} = options || {}; } = options || {};
// === 新增:拍平树形数据 ===
const flatData = flattenTree<any>(Array.isArray(dataSource) ? dataSource : [], childrenKey); const flatData = flattenTree<any>(Array.isArray(dataSource) ? dataSource : [], childrenKey);
const columns = pruneHiddenColumns(rawColumns); const columns = pruneHiddenColumns(rawColumns);
@ -219,18 +227,16 @@ export async function exportXlsxFromProColumnsExcelJS(
const totalSheets = Math.max(1, Math.ceil(total / chunkSize)); const totalSheets = Math.max(1, Math.ceil(total / chunkSize));
for (let si = 0; si < totalSheets; si++) { for (let si = 0; si < totalSheets; si++) {
const ws = wb.addWorksheet(totalSheets === 1 ? sheetName : `${sheetName}_${si + 1}`, { // 注意:不再传 views 配置,避免任何默认冻结
views: [{ state: 'frozen' }], const ws = wb.addWorksheet(totalSheets === 1 ? sheetName : `${sheetName}_${si + 1}`);
});
// 1) 顶部大标题(可选)
let currentRowIndex = 1; let currentRowIndex = 1;
// 顶部标题
if (topTitle) { if (topTitle) {
const row = ws.getRow(currentRowIndex); const row = ws.getRow(currentRowIndex);
// 写入一个单元格,再合并整行
row.getCell(1).value = topTitle; row.getCell(1).value = topTitle;
ws.mergeCells(currentRowIndex, 1, currentRowIndex, columnCount); ws.mergeCells(currentRowIndex, 1, currentRowIndex, columnCount);
// 居中 + 加粗 + 较大字号
const cell = ws.getCell(currentRowIndex, 1); const cell = ws.getCell(currentRowIndex, 1);
cell.alignment = { horizontal: 'center', vertical: 'middle' }; cell.alignment = { horizontal: 'center', vertical: 'middle' };
cell.font = { bold: true, size: 14 }; cell.font = { bold: true, size: 14 };
@ -238,10 +244,9 @@ export async function exportXlsxFromProColumnsExcelJS(
currentRowIndex += 1; currentRowIndex += 1;
} }
// 2) 信息行(可选,左右结构) // 信息行
if (infoRowLeft != null || infoRowRight != null) { if (infoRowLeft != null || infoRowRight != null) {
const row = ws.getRow(currentRowIndex); const row = ws.getRow(currentRowIndex);
// 左侧:合并 1..(columnCount/2),左对齐
const split = Math.max(1, Math.floor(columnCount / 2)); const split = Math.max(1, Math.floor(columnCount / 2));
if (infoRowLeft != null) { if (infoRowLeft != null) {
row.getCell(1).value = infoRowLeft; row.getCell(1).value = infoRowLeft;
@ -250,7 +255,6 @@ export async function exportXlsxFromProColumnsExcelJS(
leftCell.alignment = { horizontal: 'left', vertical: 'middle' }; leftCell.alignment = { horizontal: 'left', vertical: 'middle' };
leftCell.font = { size: 11 }; leftCell.font = { size: 11 };
} }
// 右侧:合并 (split+1)..columnCount右对齐
if (infoRowRight != null) { if (infoRowRight != null) {
row.getCell(split + 1).value = infoRowRight; row.getCell(split + 1).value = infoRowRight;
ws.mergeCells(currentRowIndex, split + 1, currentRowIndex, columnCount); ws.mergeCells(currentRowIndex, split + 1, currentRowIndex, columnCount);
@ -262,7 +266,7 @@ export async function exportXlsxFromProColumnsExcelJS(
currentRowIndex += 1; currentRowIndex += 1;
} }
// 3) 多级表头(全部居中 + 加粗 // 表头(保持原有样式与合并
const headerStartRow = currentRowIndex; const headerStartRow = currentRowIndex;
headerAOA.forEach((r, idx) => { headerAOA.forEach((r, idx) => {
const row = ws.getRow(headerStartRow + idx); const row = ws.getRow(headerStartRow + idx);
@ -274,13 +278,12 @@ export async function exportXlsxFromProColumnsExcelJS(
}); });
row.height = 18; row.height = 18;
}); });
// 应用表头合并
merges.forEach(m => { merges.forEach(m => {
ws.mergeCells(headerStartRow + (m.r1 - 1), m.c1, headerStartRow + (m.r2 - 1), m.c2); ws.mergeCells(headerStartRow + (m.r1 - 1), m.c1, headerStartRow + (m.r2 - 1), m.c2);
}); });
currentRowIndex += headerAOA.length; currentRowIndex += headerAOA.length;
// 4) 数据(从 currentRowIndex 开始) // 数据区
const start = si * chunkSize; const start = si * chunkSize;
const end = Math.min(start + chunkSize, total); const end = Math.min(start + chunkSize, total);
const batch = flatData.slice(start, end); const batch = flatData.slice(start, end);
@ -290,19 +293,14 @@ export async function exportXlsxFromProColumnsExcelJS(
const row = ws.getRow(currentRowIndex + i); const row = ws.getRow(currentRowIndex + i);
leafCols.forEach((col, j) => { leafCols.forEach((col, j) => {
const cell = row.getCell(j + 1); const cell = row.getCell(j + 1);
// 这里 rowIndex 仍然传全局行号 start + i序号列会自动正确 const v = getCellValue(col, rec, start + i);
cell.value = getCellValue(col, rec, start + i); cell.value = v;
if (col.align) cell.alignment = { horizontal: col.align, vertical: 'middle' };
// 设置单元格对齐方式
if (col.align) {
cell.alignment = { horizontal: col.align, vertical: 'middle' };
}
}); });
// 适度让出主线程ExcelJS 是纯 JS通常也很稳如需进一步优化可用 setTimeout 分批
} }
currentRowIndex += batch.length; currentRowIndex += batch.length;
// 5) 列宽:基于表头 + 采样数据估算 // 列宽估算
const sampleRows = Math.min(batch.length, 200); const sampleRows = Math.min(batch.length, 200);
for (let c = 1; c <= columnCount; c++) { for (let c = 1; c <= columnCount; c++) {
const headerMax = Math.max(...headerAOA.map(r => estimateWidth(r[c - 1]))); const headerMax = Math.max(...headerAOA.map(r => estimateWidth(r[c - 1])));
@ -314,20 +312,66 @@ export async function exportXlsxFromProColumnsExcelJS(
ws.getColumn(c).width = Math.max(headerMax, dataMax); ws.getColumn(c).width = Math.max(headerMax, dataMax);
} }
// 6) 冻结窗格:冻结到(标题 + 信息行 + 表头)这一行的下一行 // 注意:不再对 ws.views 进行任何设置(避免冻结表头)
if (freezeHeader) { // if (freezeHeader) { ... } // 已移除
// const freezeRow = (topTitle ? 1 : 0) + (infoRowLeft != null || infoRowRight != null ? 1 : 0) + headerAOA.length;
// ws.views = [{ state: 'frozen', ySplit: freezeRow }]; // 底部三项(同一行 + 平均分列 + 直接显示“标题:值”)
if (footerMaker != null || footerMakerTime != null || footerStatsTime != null) {
currentRowIndex += 1;
const footerRow = ws.getRow(currentRowIndex);
const items = [
`制单人员:${footerMaker ?? ''}`,
`制单时间:${footerMakerTime ?? ''}`,
`统计时间:${footerStatsTime ?? ''}`,
];
const groups = 3;
const base = Math.floor(columnCount / groups);
let remainder = columnCount - base * groups;
const sizes: number[] = [];
for (let g = 0; g < groups; g++) {
sizes.push(base + (remainder > 0 ? 1 : 0));
if (remainder > 0) remainder -= 1;
}
if (columnCount < groups) {
for (let g = 0; g < groups; g++) sizes[g] = 0;
for (let k = 0; k < columnCount; k++) sizes[k] = 1;
}
let colCursor = 1;
for (let g = 0; g < groups; g++) {
const segSize = sizes[g];
if (segSize <= 0) continue;
const startCol = colCursor;
const endCol = colCursor + segSize - 1;
if (endCol > startCol) ws.mergeCells(currentRowIndex, startCol, currentRowIndex, endCol);
const cell = footerRow.getCell(startCol);
cell.value = items[g];
cell.alignment = { horizontal: 'left', vertical: 'middle' };
cell.font = { size: 11 };
colCursor += segSize;
}
footerRow.height = 18;
currentRowIndex += 1;
} }
} }
// 生成并下载(浏览器环境) // 生成并触发下载
const buf = await wb.xlsx.writeBuffer(); const buf = await wb.xlsx.writeBuffer();
const blob = new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); const blob = new Blob([buf], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
});
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
const a = document.createElement('a'); const a = document.createElement('a');
a.href = url; a.href = url;
a.download = `${filename}.xlsx`; a.download = `${filename || sheetName}.xlsx`;
a.click(); a.click();
URL.revokeObjectURL(url); setTimeout(() => URL.revokeObjectURL(url), 1000);
} }