diff --git a/core/api/src/main/java/com/wansenai/api/financial/CollectionReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/CollectionReceiptController.java
index 7dae5b091..9d431ebfe 100644
--- a/core/api/src/main/java/com/wansenai/api/financial/CollectionReceiptController.java
+++ b/core/api/src/main/java/com/wansenai/api/financial/CollectionReceiptController.java
@@ -19,6 +19,7 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.CollectionDetailVO;
 import com.wansenai.vo.financial.CollectionVO;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -27,6 +28,7 @@
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
 
 import java.util.List;
 
@@ -64,4 +66,9 @@ public Response<String> deleteCollectionReceiptByIds(@RequestParam("ids") List<L
     public Response<String> updateCollectionReceiptStatusByIds(@RequestParam("ids") List<Long> ids, @RequestParam("status") Integer status) {
         return collectionReceiptService.updateCollectionReceiptStatus(ids, status);
     }
+
+    @GetMapping("export")
+    public void exportCollectionReceipt(@ModelAttribute QueryCollectionDTO queryCollectionDTO, HttpServletResponse response) {
+        collectionReceiptService.exportCollectionReceipt(queryCollectionDTO, response);
+    }
 }
diff --git a/core/api/src/main/java/com/wansenai/api/financial/ExpenseReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/ExpenseReceiptController.java
index 6980a72a2..dd50ddc8e 100644
--- a/core/api/src/main/java/com/wansenai/api/financial/ExpenseReceiptController.java
+++ b/core/api/src/main/java/com/wansenai/api/financial/ExpenseReceiptController.java
@@ -19,14 +19,16 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.ExpenseDetailVO;
 import com.wansenai.vo.financial.ExpenseVO;
-import org.springframework.web.bind.annotation.PostMapping;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
 
 import java.util.List;
 
@@ -64,4 +66,9 @@ public Response<String> deleteExpenseReceiptByIds(@RequestParam("ids") List<Long
     public Response<String> updateExpenseReceiptStatusByIds(@RequestParam("ids") List<Long> ids, @RequestParam("status") Integer status) {
         return expenseReceiptService.updateExpenseReceiptStatus(ids, status);
     }
+
+    @GetMapping("export")
+    public void exportExpenseReceipt(@ModelAttribute QueryExpenseDTO queryExpenseDTO, HttpServletResponse response) {
+        expenseReceiptService.exportExpenseReceipt(queryExpenseDTO, response);
+    }
 }
diff --git a/core/api/src/main/java/com/wansenai/api/financial/IncomeReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/IncomeReceiptController.java
index 7df1e7dff..b6c7e70e7 100644
--- a/core/api/src/main/java/com/wansenai/api/financial/IncomeReceiptController.java
+++ b/core/api/src/main/java/com/wansenai/api/financial/IncomeReceiptController.java
@@ -19,6 +19,7 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.IncomeDetailVO;
 import com.wansenai.vo.financial.IncomeVO;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -27,6 +28,7 @@
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
 
 import java.util.List;
 
@@ -64,4 +66,9 @@ public Response<String> deleteIncomeReceiptByIds(@RequestParam("ids") List<Long>
     public Response<String> updateIncomeReceiptStatusByIds(@RequestParam("ids") List<Long> ids, @RequestParam("status") Integer status) {
         return incomeReceiptService.updateIncomeReceiptStatus(ids, status);
     }
+
+    @GetMapping("export")
+    public void exportIncomeReceipt(@ModelAttribute QueryIncomeDTO queryIncomeDTO, HttpServletResponse response) {
+        incomeReceiptService.exportIncomeReceipt(queryIncomeDTO, response);
+    }
 }
diff --git a/core/api/src/main/java/com/wansenai/api/financial/PaymentReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/PaymentReceiptController.java
index 273f05bb1..1b34584f4 100644
--- a/core/api/src/main/java/com/wansenai/api/financial/PaymentReceiptController.java
+++ b/core/api/src/main/java/com/wansenai/api/financial/PaymentReceiptController.java
@@ -19,7 +19,16 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.PaymentDetailVO;
 import com.wansenai.vo.financial.PaymentVO;
-import org.springframework.web.bind.annotation.*;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
 
 import java.util.List;
 
@@ -57,4 +66,9 @@ public Response<String> deletePaymentReceiptByIds(@RequestParam("ids") List<Long
     public Response<String> updatePaymentReceiptStatusByIds(@RequestParam("ids") List<Long> ids, @RequestParam("status") Integer status) {
         return paymentReceiptService.updatePaymentReceiptStatus(ids, status);
     }
+
+    @GetMapping("export")
+    public void exportPaymentReceipt(@ModelAttribute QueryPaymentDTO queryPaymentDTO, HttpServletResponse response) {
+        paymentReceiptService.exportPaymentReceipt(queryPaymentDTO, response);
+    }
 }
diff --git a/core/api/src/main/java/com/wansenai/api/financial/TransferReceiptController.java b/core/api/src/main/java/com/wansenai/api/financial/TransferReceiptController.java
index cfd489471..9ee4b8f6d 100644
--- a/core/api/src/main/java/com/wansenai/api/financial/TransferReceiptController.java
+++ b/core/api/src/main/java/com/wansenai/api/financial/TransferReceiptController.java
@@ -19,6 +19,7 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.TransferDetailVO;
 import com.wansenai.vo.financial.TransferVO;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -27,6 +28,7 @@
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
 
 import java.util.List;
 
@@ -64,4 +66,9 @@ public Response<String> deleteTransferReceiptByIds(@RequestParam("ids") List<Lon
     public Response<String> updateTransferReceiptStatusByIds(@RequestParam("ids") List<Long> ids, @RequestParam("status") Integer status) {
         return transferReceiptService.updateTransferReceiptStatus(ids, status);
     }
+
+    @GetMapping("export")
+    public void exportTransferReceipt(@ModelAttribute QueryTransferDTO queryTransferDTO, HttpServletResponse response) {
+        transferReceiptService.exportTransferReceipt(queryTransferDTO, response);
+    }
 }
diff --git a/core/api/src/main/kotlin/com/wansenai/api/financial/AdvanceChargeController.kt b/core/api/src/main/kotlin/com/wansenai/api/financial/AdvanceChargeController.kt
index bc0c08d05..ee16b21b3 100644
--- a/core/api/src/main/kotlin/com/wansenai/api/financial/AdvanceChargeController.kt
+++ b/core/api/src/main/kotlin/com/wansenai/api/financial/AdvanceChargeController.kt
@@ -12,6 +12,15 @@
  */
 package com.wansenai.api.financial
 
+import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.PostMapping
+import org.springframework.web.bind.annotation.RequestBody
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.PathVariable
+import org.springframework.web.bind.annotation.PutMapping
+import org.springframework.web.bind.annotation.RequestParam
+import org.springframework.web.bind.annotation.ModelAttribute
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page
 import com.wansenai.dto.financial.AddOrUpdateAdvanceChargeDTO
 import com.wansenai.dto.financial.QueryAdvanceChargeDTO
@@ -19,14 +28,7 @@ import com.wansenai.service.financial.AdvanceChargeService
 import com.wansenai.utils.response.Response
 import com.wansenai.vo.financial.AdvanceChargeDetailVO
 import com.wansenai.vo.financial.AdvanceChargeVO
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.PathVariable
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.PutMapping
-import org.springframework.web.bind.annotation.RequestBody
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RequestParam
-import org.springframework.web.bind.annotation.RestController
+import jakarta.servlet.http.HttpServletResponse
 
 @RestController
 @RequestMapping("/financial/advance-charge")
@@ -56,4 +58,9 @@ class AdvanceChargeController(private val advanceChargeService: AdvanceChargeSer
     fun updateStatus(@RequestParam("ids") ids: List<Long>, @RequestParam("status") status: Int) : Response<String> {
         return advanceChargeService.updateAdvanceChargeStatusById(ids, status)
     }
+
+    @GetMapping("export")
+    fun export(@ModelAttribute advanceChargeDTO: QueryAdvanceChargeDTO, response: HttpServletResponse) {
+        advanceChargeService.exportAdvanceCharge(advanceChargeDTO, response)
+    }
 }
\ No newline at end of file
diff --git a/core/domain/src/main/java/com/wansenai/bo/CollectionDataExportBO.java b/core/domain/src/main/java/com/wansenai/bo/CollectionDataExportBO.java
new file mode 100644
index 000000000..47ffddf70
--- /dev/null
+++ b/core/domain/src/main/java/com/wansenai/bo/CollectionDataExportBO.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
+ * with the License. A copy of the License is located at
+ *
+ * http://opensource.wansenai.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ */
+package com.wansenai.bo;
+
+import com.wansenai.utils.excel.ExcelExport;
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+public class CollectionDataExportBO {
+
+    @ExcelExport(value = "客户")
+    private String customerName;
+
+    @ExcelExport(value = "收款单号")
+    private String receiptNumber;
+
+    @ExcelExport(value = "销售单据编号")
+    private String saleReceiptNumber;
+
+    @ExcelExport(value = "应收欠款")
+    private BigDecimal receivableArrears;
+
+    @ExcelExport(value = "已收欠款")
+    private BigDecimal receivedArrears;
+
+    @ExcelExport(value = "本次收款")
+    private BigDecimal thisCollectionAmount;
+
+    @ExcelExport(value = "备注")
+    private String remark;
+}
diff --git a/core/domain/src/main/java/com/wansenai/bo/IncomeExpenseDataExportBO.java b/core/domain/src/main/java/com/wansenai/bo/IncomeExpenseDataExportBO.java
new file mode 100644
index 000000000..b20e714cc
--- /dev/null
+++ b/core/domain/src/main/java/com/wansenai/bo/IncomeExpenseDataExportBO.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
+ * with the License. A copy of the License is located at
+ *
+ * http://opensource.wansenai.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ */
+package com.wansenai.bo;
+
+import com.wansenai.utils.excel.ExcelExport;
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+public class IncomeExpenseDataExportBO {
+
+    @ExcelExport(value = "单据编号")
+    private String receiptNumber;
+
+    @ExcelExport(value = "往来单位/人员")
+    private String relatedPerson;
+
+    @ExcelExport(value = "收入/支出项目")
+    private String incomeExpenseName;
+
+    @ExcelExport(value = "金额")
+    private BigDecimal incomeExpenseAmount;
+
+    @ExcelExport(value = "备注")
+    private String remark;
+}
diff --git a/core/domain/src/main/java/com/wansenai/bo/PaymentDataExportBO.java b/core/domain/src/main/java/com/wansenai/bo/PaymentDataExportBO.java
new file mode 100644
index 000000000..95ea15020
--- /dev/null
+++ b/core/domain/src/main/java/com/wansenai/bo/PaymentDataExportBO.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
+ * with the License. A copy of the License is located at
+ *
+ * http://opensource.wansenai.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ */
+package com.wansenai.bo;
+
+import com.wansenai.utils.excel.ExcelExport;
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+public class PaymentDataExportBO {
+
+    @ExcelExport(value = "供应商")
+    private String supplierName;
+
+    @ExcelExport(value = "付款单号")
+    private String receiptNumber;
+
+    @ExcelExport(value = "采购单据编号")
+    private String purchaseReceiptNumber;
+
+    @ExcelExport(value = "应付欠款")
+    private BigDecimal paymentArrears;
+
+    @ExcelExport(value = "已付欠款")
+    private BigDecimal  prepaidArrears;
+
+    @ExcelExport(value = "本次付款")
+    private BigDecimal thisPaymentAmount;
+
+    @ExcelExport(value = "备注")
+    private String remark;
+}
diff --git a/core/domain/src/main/java/com/wansenai/bo/TransferAccountDataExportBO.java b/core/domain/src/main/java/com/wansenai/bo/TransferAccountDataExportBO.java
new file mode 100644
index 000000000..3158ae16d
--- /dev/null
+++ b/core/domain/src/main/java/com/wansenai/bo/TransferAccountDataExportBO.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
+ * with the License. A copy of the License is located at
+ *
+ * http://opensource.wansenai.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ */
+package com.wansenai.bo;
+
+import com.wansenai.utils.excel.ExcelExport;
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+public class TransferAccountDataExportBO {
+
+    @ExcelExport(value = "单据编号")
+    private String receiptNumber;
+
+    @ExcelExport(value = "账户名称")
+    private String accountName;
+
+    @ExcelExport(value = "转账金额")
+    private BigDecimal transferAmount;
+
+    @ExcelExport(value = "备注")
+    private String remark;
+}
diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryCollectionDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryCollectionDTO.java
index 29f79c7ad..3fbca2227 100644
--- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryCollectionDTO.java
+++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryCollectionDTO.java
@@ -38,4 +38,6 @@ public class QueryCollectionDTO {
     private Integer page;
 
     private Integer pageSize;
+
+    private Boolean isExportDetail;
 }
diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryExpenseDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryExpenseDTO.java
index 94d0ca627..3d8703cc3 100644
--- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryExpenseDTO.java
+++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryExpenseDTO.java
@@ -36,4 +36,6 @@ public class QueryExpenseDTO {
     private Integer page;
 
     private Integer pageSize;
+
+    private Boolean isExportDetail;
 }
diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryIncomeDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryIncomeDTO.java
index 1203dc1c1..6dd954795 100644
--- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryIncomeDTO.java
+++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryIncomeDTO.java
@@ -36,4 +36,6 @@ public class QueryIncomeDTO {
     private Integer page;
 
     private Integer pageSize;
+
+    private Boolean isExportDetail;
 }
diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryPaymentDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryPaymentDTO.java
index 7ddcf608e..849a3e043 100644
--- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryPaymentDTO.java
+++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryPaymentDTO.java
@@ -38,4 +38,6 @@ public class QueryPaymentDTO {
     private Integer page;
 
     private Integer pageSize;
+
+    private Boolean isExportDetail;
 }
diff --git a/core/domain/src/main/java/com/wansenai/dto/financial/QueryTransferDTO.java b/core/domain/src/main/java/com/wansenai/dto/financial/QueryTransferDTO.java
index 685e4071d..0d3819cbf 100644
--- a/core/domain/src/main/java/com/wansenai/dto/financial/QueryTransferDTO.java
+++ b/core/domain/src/main/java/com/wansenai/dto/financial/QueryTransferDTO.java
@@ -34,4 +34,6 @@ public class QueryTransferDTO {
     private Integer page;
 
     private Integer pageSize;
+
+    private Boolean isExportDetail;
 }
diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/CollectionVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/CollectionVO.java
index 331ca4127..989fcf25b 100644
--- a/core/domain/src/main/java/com/wansenai/vo/financial/CollectionVO.java
+++ b/core/domain/src/main/java/com/wansenai/vo/financial/CollectionVO.java
@@ -15,6 +15,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.wansenai.bo.BigDecimalSerializerBO;
+import com.wansenai.utils.excel.ExcelExport;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -32,27 +33,37 @@ public class CollectionVO {
     @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long id;
 
+    @ExcelExport(value = "客户")
     private String customerName;
 
+    @ExcelExport(value = "单据编号")
     private String receiptNumber;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelExport(value = "单据日期")
     private LocalDateTime receiptDate;
 
+    @ExcelExport(value = "财务人员")
     private String financialPerson;
 
+    @ExcelExport(value = "收款账户")
     private String collectionAccountName;
 
     @JsonSerialize(using = BigDecimalSerializerBO.class)
+    @ExcelExport(value = "合计收款")
     private BigDecimal totalCollectionAmount;
 
     @JsonSerialize(using = BigDecimalSerializerBO.class)
+    @ExcelExport(value = "优惠金额")
     private BigDecimal discountAmount;
 
     @JsonSerialize(using = BigDecimalSerializerBO.class)
+    @ExcelExport(value = "实际收款")
     private BigDecimal actualCollectionAmount;
 
+    @ExcelExport(value = "备注")
     private String remark;
 
+    @ExcelExport(value = "状态", kv = "0:未审核;1:已审核")
     private Integer status;
 }
diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/ExpenseVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/ExpenseVO.java
index 51a50a99d..e45a9b9c6 100644
--- a/core/domain/src/main/java/com/wansenai/vo/financial/ExpenseVO.java
+++ b/core/domain/src/main/java/com/wansenai/vo/financial/ExpenseVO.java
@@ -15,6 +15,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.wansenai.bo.BigDecimalSerializerBO;
+import com.wansenai.utils.excel.ExcelExport;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -33,21 +34,29 @@ public class ExpenseVO {
     private Long id;
 
     // supplier or customer or member
+    @ExcelExport(value = "往来单位/人员")
     private String name;
 
+    @ExcelExport(value = "单据编号")
     private String receiptNumber;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelExport(value = "单据日期")
     private LocalDateTime receiptDate;
 
+    @ExcelExport(value = "财务人员")
     private String financialPerson;
 
+    @ExcelExport(value = "支出账户")
     private String expenseAccountName;
 
     @JsonSerialize(using = BigDecimalSerializerBO.class)
+    @ExcelExport(value = "支出金额")
     private BigDecimal expenseAmount;
 
+    @ExcelExport(value = "备注")
     private String remark;
 
+    @ExcelExport(value = "状态", kv = "0-未审核;1-已审核")
     private Integer status;
 }
diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/IncomeVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/IncomeVO.java
index b838077ba..b86215b29 100644
--- a/core/domain/src/main/java/com/wansenai/vo/financial/IncomeVO.java
+++ b/core/domain/src/main/java/com/wansenai/vo/financial/IncomeVO.java
@@ -15,6 +15,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.wansenai.bo.BigDecimalSerializerBO;
+import com.wansenai.utils.excel.ExcelExport;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -33,21 +34,29 @@ public class IncomeVO {
     private Long id;
 
     // supplier or customer or member
+    @ExcelExport(value = "往来单位/人员")
     private String name;
 
+    @ExcelExport(value = "单据编号")
     private String receiptNumber;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelExport(value = "单据日期")
     private LocalDateTime receiptDate;
 
+    @ExcelExport(value = "财务人员")
     private String financialPerson;
 
+    @ExcelExport(value = "收入账户")
     private String incomeAccountName;
 
     @JsonSerialize(using = BigDecimalSerializerBO.class)
+    @ExcelExport(value = "收入金额")
     private BigDecimal incomeAmount;
 
+    @ExcelExport(value = "备注")
     private String remark;
 
+    @ExcelExport(value = "状态", kv = "0-未审核;1-已审核")
     private Integer status;
 }
diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/PaymentVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/PaymentVO.java
index 8d57bf08b..b7ab064bb 100644
--- a/core/domain/src/main/java/com/wansenai/vo/financial/PaymentVO.java
+++ b/core/domain/src/main/java/com/wansenai/vo/financial/PaymentVO.java
@@ -15,6 +15,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.wansenai.bo.BigDecimalSerializerBO;
+import com.wansenai.utils.excel.ExcelExport;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -32,27 +33,37 @@ public class PaymentVO {
     @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long id;
 
+    @ExcelExport(value = "供应商")
     private String supplierName;
 
+    @ExcelExport(value = "单据编号")
     private String receiptNumber;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelExport(value = "单据日期")
     private LocalDateTime receiptDate;
 
+    @ExcelExport(value = "财务人员")
     private String financialPerson;
 
+    @ExcelExport(value = "付款账户")
     private String paymentAccountName;
 
     @JsonSerialize(using = BigDecimalSerializerBO.class)
+    @ExcelExport(value = "合计付款")
     private BigDecimal totalPaymentAmount;
 
     @JsonSerialize(using = BigDecimalSerializerBO.class)
+    @ExcelExport(value = "优惠金额")
     private BigDecimal discountAmount;
 
     @JsonSerialize(using = BigDecimalSerializerBO.class)
+    @ExcelExport(value = "实际付款")
     private BigDecimal actualPaymentAmount;
 
+    @ExcelExport(value = "备注")
     private String remark;
 
+    @ExcelExport(value = "状态", kv = "0:未审核;1:已审核")
     private Integer status;
 }
diff --git a/core/domain/src/main/java/com/wansenai/vo/financial/TransferVO.java b/core/domain/src/main/java/com/wansenai/vo/financial/TransferVO.java
index 85ab21b8e..97a3df00a 100644
--- a/core/domain/src/main/java/com/wansenai/vo/financial/TransferVO.java
+++ b/core/domain/src/main/java/com/wansenai/vo/financial/TransferVO.java
@@ -15,6 +15,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.wansenai.bo.BigDecimalSerializerBO;
+import com.wansenai.utils.excel.ExcelExport;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -32,19 +33,26 @@ public class TransferVO {
     @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long id;
 
+    @ExcelExport(value = "单据编号")
     private String receiptNumber;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelExport(value = "单据日期")
     private LocalDateTime receiptDate;
 
+    @ExcelExport(value = "财务人员")
     private String financialPerson;
 
+    @ExcelExport(value = "付款账户")
     private String paymentAccountName;
 
     @JsonSerialize(using = BigDecimalSerializerBO.class)
+    @ExcelExport(value = "付款金额")
     private BigDecimal paymentAmount;
 
+    @ExcelExport(value = "备注")
     private String remark;
 
+    @ExcelExport(value = "状态", kv = "0:未审核;1:已审核")
     private Integer status;
 }
diff --git a/core/domain/src/main/kotlin/com/wansenai/bo/AdvanceChargeDataExportBO.kt b/core/domain/src/main/kotlin/com/wansenai/bo/AdvanceChargeDataExportBO.kt
new file mode 100644
index 000000000..beac4fe06
--- /dev/null
+++ b/core/domain/src/main/kotlin/com/wansenai/bo/AdvanceChargeDataExportBO.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2023-2033 WanSen AI Team, Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
+ * with the License. A copy of the License is located at
+ *
+ * http://opensource.wansenai.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
+ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ */
+package com.wansenai.bo
+
+import com.wansenai.NoArg
+import com.wansenai.utils.excel.ExcelExport
+import lombok.Data
+import java.math.BigDecimal
+
+@NoArg
+@Data
+data class AdvanceChargeDataExportBO(
+
+    @ExcelExport(value = "会员")
+    val memberName: String,
+
+    @ExcelExport(value = "预付款单据编号")
+    val receiptNumber: String,
+
+    @ExcelExport(value = "账户名称")
+    val accountName: String,
+
+    @ExcelExport(value = "金额")
+    val amount : BigDecimal,
+
+    @ExcelExport(value = "备注")
+    val remark : String? = null,
+)
\ No newline at end of file
diff --git a/core/domain/src/main/kotlin/com/wansenai/dto/financial/QueryAdvanceChargeDTO.kt b/core/domain/src/main/kotlin/com/wansenai/dto/financial/QueryAdvanceChargeDTO.kt
index 18b118842..990892054 100644
--- a/core/domain/src/main/kotlin/com/wansenai/dto/financial/QueryAdvanceChargeDTO.kt
+++ b/core/domain/src/main/kotlin/com/wansenai/dto/financial/QueryAdvanceChargeDTO.kt
@@ -36,4 +36,6 @@ data class QueryAdvanceChargeDTO (
     val startDate: String?,
 
     val endDate: String?,
+
+    val isExportDetail: Boolean?,
 )
diff --git a/core/domain/src/main/kotlin/com/wansenai/vo/financial/AdvanceChargeVO.kt b/core/domain/src/main/kotlin/com/wansenai/vo/financial/AdvanceChargeVO.kt
index ac986b9f7..35a072b6a 100644
--- a/core/domain/src/main/kotlin/com/wansenai/vo/financial/AdvanceChargeVO.kt
+++ b/core/domain/src/main/kotlin/com/wansenai/vo/financial/AdvanceChargeVO.kt
@@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonFormat
 import com.fasterxml.jackson.databind.annotation.JsonSerialize
 import com.wansenai.NoArg
 import com.wansenai.bo.BigDecimalSerializerBO
+import com.wansenai.utils.excel.ExcelExport
 import lombok.Data
 import java.math.BigDecimal
 import java.time.LocalDateTime
@@ -27,24 +28,33 @@ data class AdvanceChargeVO (
     @JsonFormat(shape = JsonFormat.Shape.STRING)
     var id: Long? = null,
 
-    var memberName: String? = null,
+    @ExcelExport(value = "会员")
+    var memberName: String,
 
+    @ExcelExport(value = "单据编号")
     var receiptNumber: String,
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ExcelExport(value = "单据日期")
     var receiptDate: LocalDateTime,
 
-    var operator: String,
-
-    var financialPersonnel: String,
+    @JsonSerialize(using = BigDecimalSerializerBO::class)
+    @ExcelExport(value = "收款金额")
+    var collectedAmount : BigDecimal,
 
     @JsonSerialize(using = BigDecimalSerializerBO::class)
+    @ExcelExport(value = "合计金额")
     var totalAmount : BigDecimal,
 
-    @JsonSerialize(using = BigDecimalSerializerBO::class)
-    var collectedAmount : BigDecimal,
+    @ExcelExport(value = "财务人员")
+    var financialPersonnel: String,
+
+    @ExcelExport(value = "操作员")
+    var operator: String,
 
+    @ExcelExport(value = "备注")
     var remark: String? = null,
 
+    @ExcelExport(value = "状态", kv = "0:未审核;1:已审核")
     var status: Int,
 )
diff --git a/core/service/src/main/java/com/wansenai/service/financial/CollectionReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/CollectionReceiptService.java
index 32dac4eb5..4c968e488 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/CollectionReceiptService.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/CollectionReceiptService.java
@@ -20,6 +20,7 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.CollectionDetailVO;
 import com.wansenai.vo.financial.CollectionVO;
+import jakarta.servlet.http.HttpServletResponse;
 
 import java.util.List;
 
@@ -34,4 +35,6 @@ public interface CollectionReceiptService extends IService<FinancialMain> {
     Response<String> deleteBatchCollectionReceipt(List<Long> ids);
 
     Response<String> updateCollectionReceiptStatus(List<Long> ids, Integer status);
+
+    void exportCollectionReceipt(QueryCollectionDTO queryCollectionDTO, HttpServletResponse response);
 }
diff --git a/core/service/src/main/java/com/wansenai/service/financial/ExpenseReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/ExpenseReceiptService.java
index 52e5a8f95..d62a03f90 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/ExpenseReceiptService.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/ExpenseReceiptService.java
@@ -20,6 +20,7 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.ExpenseDetailVO;
 import com.wansenai.vo.financial.ExpenseVO;
+import jakarta.servlet.http.HttpServletResponse;
 
 import java.util.List;
 
@@ -34,4 +35,6 @@ public interface ExpenseReceiptService extends IService<FinancialMain> {
     Response<String> deleteBatchExpenseReceipt(List<Long> ids);
 
     Response<String> updateExpenseReceiptStatus(List<Long> ids, Integer status);
+
+    void exportExpenseReceipt(QueryExpenseDTO queryExpenseDTO, HttpServletResponse response);
 }
diff --git a/core/service/src/main/java/com/wansenai/service/financial/IncomeReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/IncomeReceiptService.java
index ff11c5663..f156b7f0a 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/IncomeReceiptService.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/IncomeReceiptService.java
@@ -20,6 +20,7 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.IncomeDetailVO;
 import com.wansenai.vo.financial.IncomeVO;
+import jakarta.servlet.http.HttpServletResponse;
 
 import java.util.List;
 
@@ -34,4 +35,6 @@ public interface IncomeReceiptService extends IService<FinancialMain> {
     Response<String> deleteBatchIncomeReceipt(List<Long> ids);
 
     Response<String> updateIncomeReceiptStatus(List<Long> ids, Integer status);
+
+    void exportIncomeReceipt(QueryIncomeDTO queryIncomeDTO, HttpServletResponse response);
 }
diff --git a/core/service/src/main/java/com/wansenai/service/financial/PaymentReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/PaymentReceiptService.java
index 8b6da33ed..1a2a41746 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/PaymentReceiptService.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/PaymentReceiptService.java
@@ -20,6 +20,7 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.PaymentDetailVO;
 import com.wansenai.vo.financial.PaymentVO;
+import jakarta.servlet.http.HttpServletResponse;
 
 import java.util.List;
 
@@ -34,4 +35,6 @@ public interface PaymentReceiptService extends IService<FinancialMain> {
     Response<String> deleteBatchPaymentReceipt(List<Long> ids);
 
     Response<String> updatePaymentReceiptStatus(List<Long> ids, Integer status);
+
+    void exportPaymentReceipt(QueryPaymentDTO queryPaymentDTO, HttpServletResponse response);
 }
diff --git a/core/service/src/main/java/com/wansenai/service/financial/TransferReceiptService.java b/core/service/src/main/java/com/wansenai/service/financial/TransferReceiptService.java
index cb6f5f1ab..930fc616b 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/TransferReceiptService.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/TransferReceiptService.java
@@ -20,6 +20,7 @@
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.TransferDetailVO;
 import com.wansenai.vo.financial.TransferVO;
+import jakarta.servlet.http.HttpServletResponse;
 
 import java.util.List;
 
@@ -34,4 +35,6 @@ public interface TransferReceiptService extends IService<FinancialMain> {
     Response<String> deleteBatchTransferReceipt(List<Long> ids);
 
     Response<String> updateTransferReceiptStatus(List<Long> ids, Integer status);
+
+    void exportTransferReceipt(QueryTransferDTO queryTransferDTO, HttpServletResponse response);
 }
diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/CollectionReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/CollectionReceiptServiceImpl.java
index caa39d8dc..253983a6a 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/impl/CollectionReceiptServiceImpl.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/impl/CollectionReceiptServiceImpl.java
@@ -15,6 +15,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.wansenai.bo.CollectionBO;
+import com.wansenai.bo.CollectionDataExportBO;
 import com.wansenai.bo.FileDataBO;
 import com.wansenai.dto.financial.AddOrUpdateCollectionDTO;
 import com.wansenai.dto.financial.QueryCollectionDTO;
@@ -33,10 +34,11 @@
 import com.wansenai.utils.constants.CommonConstants;
 import com.wansenai.utils.enums.BaseCodeEnum;
 import com.wansenai.utils.enums.CollectionPaymentCodeEnum;
-import com.wansenai.utils.enums.IncomeExpenseCodeEnum;
+import com.wansenai.utils.excel.ExcelUtils;
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.CollectionDetailVO;
 import com.wansenai.vo.financial.CollectionVO;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -46,6 +48,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 @Service
@@ -139,6 +142,41 @@ public Response<Page<CollectionVO>> getCollectionReceiptPageList(QueryCollection
         return Response.responseData(result);
     }
 
+    private List<CollectionVO> getCollectionReceiptList(QueryCollectionDTO queryCollectionDTO) {
+        var financialMainList = lambdaQuery()
+                .eq(queryCollectionDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryCollectionDTO.getFinancialPersonId())
+                .eq(queryCollectionDTO.getAccountId() != null, FinancialMain::getAccountId, queryCollectionDTO.getAccountId())
+                .eq(queryCollectionDTO.getStatus() != null, FinancialMain::getStatus, queryCollectionDTO.getStatus())
+                .eq(queryCollectionDTO.getCustomerId() != null, FinancialMain::getRelatedPersonId, queryCollectionDTO.getCustomerId())
+                .eq(StringUtils.hasLength(queryCollectionDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryCollectionDTO.getReceiptNumber())
+                .like(StringUtils.hasLength(queryCollectionDTO.getRemark()), FinancialMain::getRemark, queryCollectionDTO.getRemark())
+                .ge(StringUtils.hasLength(queryCollectionDTO.getStartDate()), FinancialMain::getReceiptDate, queryCollectionDTO.getStartDate())
+                .le(StringUtils.hasLength(queryCollectionDTO.getEndDate()), FinancialMain::getReceiptDate, queryCollectionDTO.getEndDate())
+                .eq(FinancialMain::getType, "收款")
+                .eq(FinancialMain::getDeleteFlag, CommonConstants.NOT_DELETED)
+                .list();
+
+        var collectionVOList = new ArrayList<CollectionVO>(financialMainList.size() + 1);
+        financialMainList.forEach(item -> {
+            var collectionVo = CollectionVO.builder()
+                    .id(item.getId())
+                    .receiptNumber(item.getReceiptNumber())
+                    .customerName(commonService.getCustomerName(item.getRelatedPersonId()))
+                    .receiptDate(item.getReceiptDate())
+                    .financialPerson(commonService.getOperatorName(item.getOperatorId()))
+                    .collectionAccountName(commonService.getAccountName(item.getAccountId()))
+                    .totalCollectionAmount(item.getTotalAmount())
+                    .discountAmount(item.getDiscountAmount())
+                    .actualCollectionAmount(item.getChangeAmount())
+                    .status(item.getStatus())
+                    .remark(item.getRemark())
+                    .build();
+
+            collectionVOList.add(collectionVo);
+        });
+        return collectionVOList;
+    }
+
     @Override
     public Response<CollectionDetailVO> getCollectionReceiptDetail(Long id) {
         if (id == null) {
@@ -352,4 +390,35 @@ public Response<String> updateCollectionReceiptStatus(List<Long> ids, Integer st
         }
         return Response.responseMsg(CollectionPaymentCodeEnum.UPDATE_COLLECTION_RECEIPT_SUCCESS);
     }
+
+    @Override
+    public void exportCollectionReceipt(QueryCollectionDTO queryCollectionDTO, HttpServletResponse response) {
+        var exportMap = new ConcurrentHashMap<String, List<List<Object>>>();
+        var mainData = getCollectionReceiptList(queryCollectionDTO);
+        if (!mainData.isEmpty()) {
+            exportMap.put("收款单", ExcelUtils.getSheetData(mainData));
+            if (queryCollectionDTO.getIsExportDetail()) {
+                var subData = new ArrayList<CollectionDataExportBO>();
+                for (CollectionVO collectionVO : mainData) {
+                    var detail = getCollectionReceiptDetail(collectionVO.getId()).getData().getTableData();
+                    if (!detail.isEmpty()) {
+                        detail.forEach(item -> {
+                            var data = CollectionDataExportBO.builder()
+                                    .customerName(collectionVO.getCustomerName())
+                                    .receiptNumber(collectionVO.getReceiptNumber())
+                                    .saleReceiptNumber(item.getSaleReceiptNumber())
+                                    .receivableArrears(item.getReceivableArrears())
+                                    .receivedArrears(item.getReceivedArrears())
+                                    .thisCollectionAmount(item.getThisCollectionAmount())
+                                    .remark(item.getRemark())
+                                    .build();
+                            subData.add(data);
+                        });
+                    }
+                }
+                exportMap.put("收款单明细", ExcelUtils.getSheetData(subData));
+            }
+            ExcelUtils.exportManySheet(response, "收款单", exportMap);
+        }
+    }
 }
diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/ExpenseReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/ExpenseReceiptServiceImpl.java
index 2a1785097..346649098 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/impl/ExpenseReceiptServiceImpl.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/impl/ExpenseReceiptServiceImpl.java
@@ -16,6 +16,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.wansenai.bo.FileDataBO;
 import com.wansenai.bo.IncomeExpenseBO;
+import com.wansenai.bo.IncomeExpenseDataExportBO;
 import com.wansenai.dto.financial.AddOrUpdateExpenseDTO;
 import com.wansenai.dto.financial.QueryExpenseDTO;
 import com.wansenai.entities.financial.FinancialMain;
@@ -34,11 +35,11 @@
 import com.wansenai.utils.constants.CommonConstants;
 import com.wansenai.utils.enums.BaseCodeEnum;
 import com.wansenai.utils.enums.IncomeExpenseCodeEnum;
+import com.wansenai.utils.excel.ExcelUtils;
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.ExpenseDetailVO;
 import com.wansenai.vo.financial.ExpenseVO;
-import com.wansenai.vo.financial.IncomeDetailVO;
-import com.wansenai.vo.financial.IncomeVO;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -47,6 +48,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 @Service
@@ -140,6 +142,38 @@ public Response<Page<ExpenseVO>> getExpenseReceiptPageList(QueryExpenseDTO query
         return Response.responseData(result);
     }
 
+    public List<ExpenseVO> getExpenseReceiptList(QueryExpenseDTO queryExpenseDTO) {
+        var financialMainList = lambdaQuery()
+                .eq(queryExpenseDTO.getRelatedPersonId() != null, FinancialMain::getRelatedPersonId, queryExpenseDTO.getRelatedPersonId())
+                .eq(queryExpenseDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryExpenseDTO.getFinancialPersonId())
+                .eq(queryExpenseDTO.getAccountId() != null, FinancialMain::getAccountId, queryExpenseDTO.getAccountId())
+                .eq(StringUtils.hasLength(queryExpenseDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryExpenseDTO.getReceiptNumber())
+                .eq(queryExpenseDTO.getStatus() != null, FinancialMain::getStatus, queryExpenseDTO.getStatus())
+                .like(StringUtils.hasLength(queryExpenseDTO.getRemark()), FinancialMain::getRemark, queryExpenseDTO.getRemark())
+                .ge(StringUtils.hasLength(queryExpenseDTO.getStartDate()), FinancialMain::getReceiptDate, queryExpenseDTO.getStartDate())
+                .le(StringUtils.hasLength(queryExpenseDTO.getEndDate()), FinancialMain::getReceiptDate, queryExpenseDTO.getEndDate())
+                .eq(FinancialMain::getType, "支出")
+                .list();
+
+        var expenseVOList = new ArrayList<ExpenseVO>(financialMainList.size() + 1);
+        financialMainList.forEach(item -> {
+            var expenseVO = ExpenseVO.builder()
+                    .id(item.getId())
+                    .receiptNumber(item.getReceiptNumber())
+                    .name(commonService.getRelatedPersonName(item.getRelatedPersonId()))
+                    .receiptDate(item.getReceiptDate())
+                    .financialPerson(commonService.getOperatorName(item.getOperatorId()))
+                    .expenseAccountName(commonService.getAccountName(item.getAccountId()))
+                    .expenseAmount(item.getTotalAmount())
+                    .status(item.getStatus())
+                    .remark(item.getRemark())
+                    .build();
+
+            expenseVOList.add(expenseVO);
+        });
+        return expenseVOList;
+    }
+
     @Override
     public Response<ExpenseDetailVO> getExpenseReceiptDetail(Long id) {
         if (id == null) {
@@ -335,4 +369,33 @@ public Response<String> updateExpenseReceiptStatus(List<Long> ids, Integer statu
         }
         return Response.responseMsg(IncomeExpenseCodeEnum.UPDATE_EXPENSE_RECEIPT_SUCCESS);
     }
+
+    @Override
+    public void exportExpenseReceipt(QueryExpenseDTO queryExpenseDTO, HttpServletResponse response) {
+        var exportMap = new ConcurrentHashMap<String, List<List<Object>>>();
+        var mainData = getExpenseReceiptList(queryExpenseDTO);
+        if (!mainData.isEmpty()) {
+            exportMap.put("支出单", ExcelUtils.getSheetData(mainData));
+            if (queryExpenseDTO.getIsExportDetail()) {
+                var subData = new ArrayList<IncomeExpenseDataExportBO>();
+                for (ExpenseVO expenseVO : mainData) {
+                    var detail = getExpenseReceiptDetail(expenseVO.getId()).getData().getTableData();
+                    if (!detail.isEmpty()) {
+                        detail.forEach(item -> {
+                            var data = IncomeExpenseDataExportBO.builder()
+                                    .receiptNumber(expenseVO.getReceiptNumber())
+                                    .relatedPerson(expenseVO.getName())
+                                    .incomeExpenseName(item.getIncomeExpenseName())
+                                    .incomeExpenseAmount(item.getIncomeExpenseAmount())
+                                    .remark(item.getRemark())
+                                    .build();
+                            subData.add(data);
+                        });
+                    }
+                }
+                exportMap.put("支出单明细", ExcelUtils.getSheetData(subData));
+            }
+            ExcelUtils.exportManySheet(response, "支出单", exportMap);
+        }
+    }
 }
diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/IncomeReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/IncomeReceiptServiceImpl.java
index 0d5b85c1d..70e663492 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/impl/IncomeReceiptServiceImpl.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/impl/IncomeReceiptServiceImpl.java
@@ -16,6 +16,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.wansenai.bo.FileDataBO;
 import com.wansenai.bo.IncomeExpenseBO;
+import com.wansenai.bo.IncomeExpenseDataExportBO;
 import com.wansenai.dto.financial.AddOrUpdateIncomeDTO;
 import com.wansenai.dto.financial.QueryIncomeDTO;
 import com.wansenai.entities.financial.FinancialMain;
@@ -34,9 +35,11 @@
 import com.wansenai.utils.constants.CommonConstants;
 import com.wansenai.utils.enums.BaseCodeEnum;
 import com.wansenai.utils.enums.IncomeExpenseCodeEnum;
+import com.wansenai.utils.excel.ExcelUtils;
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.IncomeDetailVO;
 import com.wansenai.vo.financial.IncomeVO;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -45,6 +48,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 @Service
@@ -139,6 +143,39 @@ public Response<Page<IncomeVO>> getIncomeReceiptPageList(QueryIncomeDTO queryInc
         return Response.responseData(result);
     }
 
+    private List<IncomeVO> getIncomeReceiptList(QueryIncomeDTO queryIncomeDTO) {
+        var financialMainList = lambdaQuery()
+                .eq(queryIncomeDTO.getRelatedPersonId() != null, FinancialMain::getRelatedPersonId, queryIncomeDTO.getRelatedPersonId())
+                .eq(queryIncomeDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryIncomeDTO.getFinancialPersonId())
+                .eq(queryIncomeDTO.getAccountId() != null, FinancialMain::getAccountId, queryIncomeDTO.getAccountId())
+                .eq(StringUtils.hasLength(queryIncomeDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryIncomeDTO.getReceiptNumber())
+                .eq(queryIncomeDTO.getStatus() != null, FinancialMain::getStatus, queryIncomeDTO.getStatus())
+                .like(StringUtils.hasLength(queryIncomeDTO.getRemark()), FinancialMain::getRemark, queryIncomeDTO.getRemark())
+                .ge(StringUtils.hasLength(queryIncomeDTO.getStartDate()), FinancialMain::getReceiptDate, queryIncomeDTO.getStartDate())
+                .le(StringUtils.hasLength(queryIncomeDTO.getEndDate()), FinancialMain::getReceiptDate, queryIncomeDTO.getEndDate())
+                .eq(FinancialMain::getType, "收入")
+                .eq(FinancialMain::getDeleteFlag, CommonConstants.NOT_DELETED)
+                .list();
+
+        var incomeVOList = new ArrayList<IncomeVO>(financialMainList.size() + 1);
+        financialMainList.forEach(item -> {
+            var incomeVO = IncomeVO.builder()
+                    .id(item.getId())
+                    .receiptNumber(item.getReceiptNumber())
+                    .name(commonService.getRelatedPersonName(item.getRelatedPersonId()))
+                    .receiptDate(item.getReceiptDate())
+                    .financialPerson(commonService.getOperatorName(item.getOperatorId()))
+                    .incomeAccountName(commonService.getAccountName(item.getAccountId()))
+                    .incomeAmount(item.getTotalAmount())
+                    .status(item.getStatus())
+                    .remark(item.getRemark())
+                    .build();
+
+            incomeVOList.add(incomeVO);
+        });
+        return incomeVOList;
+    }
+
     @Override
     public Response<IncomeDetailVO> getIncomeReceiptDetail(Long id) {
         if (id == null) {
@@ -334,4 +371,33 @@ public Response<String> updateIncomeReceiptStatus(List<Long> ids, Integer status
         }
         return Response.responseMsg(IncomeExpenseCodeEnum.UPDATE_INCOME_RECEIPT_SUCCESS);
     }
+
+    @Override
+    public void exportIncomeReceipt(QueryIncomeDTO queryIncomeDTO, HttpServletResponse response) {
+        var exportMap = new ConcurrentHashMap<String, List<List<Object>>>();
+        var mainData = getIncomeReceiptList(queryIncomeDTO);
+        if (!mainData.isEmpty()) {
+            exportMap.put("收入单", ExcelUtils.getSheetData(mainData));
+            if (queryIncomeDTO.getIsExportDetail()) {
+                var subData = new ArrayList<IncomeExpenseDataExportBO>();
+                for (IncomeVO incomeVO : mainData) {
+                    var detail = getIncomeReceiptDetail(incomeVO.getId()).getData().getTableData();
+                    if (!detail.isEmpty()) {
+                        detail.forEach(item -> {
+                            var data = IncomeExpenseDataExportBO.builder()
+                                    .receiptNumber(incomeVO.getReceiptNumber())
+                                    .relatedPerson(incomeVO.getName())
+                                    .incomeExpenseName(item.getIncomeExpenseName())
+                                    .incomeExpenseAmount(item.getIncomeExpenseAmount())
+                                    .remark(item.getRemark())
+                                    .build();
+                            subData.add(data);
+                        });
+                    }
+                }
+                exportMap.put("收入单明细", ExcelUtils.getSheetData(subData));
+            }
+            ExcelUtils.exportManySheet(response, "收入单", exportMap);
+        }
+    }
 }
diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/PaymentReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/PaymentReceiptServiceImpl.java
index 10656b911..d43c43b1a 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/impl/PaymentReceiptServiceImpl.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/impl/PaymentReceiptServiceImpl.java
@@ -14,9 +14,9 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.wansenai.bo.CollectionBO;
 import com.wansenai.bo.FileDataBO;
 import com.wansenai.bo.PaymentBO;
+import com.wansenai.bo.PaymentDataExportBO;
 import com.wansenai.dto.financial.AddOrUpdatePaymentDTO;
 import com.wansenai.dto.financial.QueryPaymentDTO;
 import com.wansenai.entities.financial.FinancialMain;
@@ -34,11 +34,11 @@
 import com.wansenai.utils.constants.CommonConstants;
 import com.wansenai.utils.enums.BaseCodeEnum;
 import com.wansenai.utils.enums.CollectionPaymentCodeEnum;
+import com.wansenai.utils.excel.ExcelUtils;
 import com.wansenai.utils.response.Response;
-import com.wansenai.vo.financial.CollectionDetailVO;
-import com.wansenai.vo.financial.CollectionVO;
 import com.wansenai.vo.financial.PaymentDetailVO;
 import com.wansenai.vo.financial.PaymentVO;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -48,6 +48,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 @Service
@@ -141,6 +142,41 @@ public Response<Page<PaymentVO>> getPaymentReceiptPageList(QueryPaymentDTO query
         return Response.responseData(result);
     }
 
+    private List<PaymentVO> getPaymentReceiptList(QueryPaymentDTO queryPaymentDTO) {
+        var financialMainList = lambdaQuery()
+                .eq(queryPaymentDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryPaymentDTO.getFinancialPersonId())
+                .eq(queryPaymentDTO.getAccountId() != null, FinancialMain::getAccountId, queryPaymentDTO.getAccountId())
+                .eq(queryPaymentDTO.getStatus() != null, FinancialMain::getStatus, queryPaymentDTO.getStatus())
+                .eq(queryPaymentDTO.getSupplierId() != null, FinancialMain::getRelatedPersonId, queryPaymentDTO.getSupplierId())
+                .eq(StringUtils.hasLength(queryPaymentDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryPaymentDTO.getReceiptNumber())
+                .like(StringUtils.hasLength(queryPaymentDTO.getRemark()), FinancialMain::getRemark, queryPaymentDTO.getRemark())
+                .ge(StringUtils.hasLength(queryPaymentDTO.getStartDate()), FinancialMain::getReceiptDate, queryPaymentDTO.getStartDate())
+                .le(StringUtils.hasLength(queryPaymentDTO.getEndDate()), FinancialMain::getReceiptDate, queryPaymentDTO.getEndDate())
+                .eq(FinancialMain::getType, "付款")
+                .eq(FinancialMain::getDeleteFlag, CommonConstants.NOT_DELETED)
+                .list();
+
+        var paymentVOList = new ArrayList<PaymentVO>(financialMainList.size() + 1);
+        financialMainList.forEach(item -> {
+            var paymentVo = PaymentVO.builder()
+                    .id(item.getId())
+                    .receiptNumber(item.getReceiptNumber())
+                    .supplierName(commonService.getSupplierName(item.getRelatedPersonId()))
+                    .receiptDate(item.getReceiptDate())
+                    .financialPerson(commonService.getOperatorName(item.getOperatorId()))
+                    .paymentAccountName(commonService.getAccountName(item.getAccountId()))
+                    .totalPaymentAmount(item.getTotalAmount())
+                    .discountAmount(item.getDiscountAmount())
+                    .actualPaymentAmount(item.getChangeAmount())
+                    .status(item.getStatus())
+                    .remark(item.getRemark())
+                    .build();
+
+            paymentVOList.add(paymentVo);
+        });
+        return paymentVOList;
+    }
+
     @Override
     public Response<PaymentDetailVO> getPaymentReceiptDetail(Long id) {
         if (id == null) {
@@ -354,4 +390,35 @@ public Response<String> updatePaymentReceiptStatus(List<Long> ids, Integer statu
         }
         return Response.responseMsg(CollectionPaymentCodeEnum.UPDATE_PAYMENT_RECEIPT_SUCCESS);
     }
+
+    @Override
+    public void exportPaymentReceipt(QueryPaymentDTO queryPaymentDTO, HttpServletResponse response) {
+        var exportMap = new ConcurrentHashMap<String, List<List<Object>>>();
+        var mainData = getPaymentReceiptList(queryPaymentDTO);
+        if (!mainData.isEmpty()) {
+            exportMap.put("付款单", ExcelUtils.getSheetData(mainData));
+            if (queryPaymentDTO.getIsExportDetail()) {
+                var subData = new ArrayList<PaymentDataExportBO>();
+                for (PaymentVO paymentVO : mainData) {
+                    var detail = getPaymentReceiptDetail(paymentVO.getId()).getData().getTableData();
+                    if (!detail.isEmpty()) {
+                        detail.forEach(item -> {
+                            var data = PaymentDataExportBO.builder()
+                                    .supplierName(paymentVO.getSupplierName())
+                                    .receiptNumber(paymentVO.getReceiptNumber())
+                                    .purchaseReceiptNumber(item.getPurchaseReceiptNumber())
+                                    .paymentArrears(item.getPaymentArrears())
+                                    .prepaidArrears(item.getPrepaidArrears())
+                                    .thisPaymentAmount(item.getThisPaymentAmount())
+                                    .remark(item.getRemark())
+                                    .build();
+                            subData.add(data);
+                        });
+                    }
+                }
+                exportMap.put("付款单明细", ExcelUtils.getSheetData(subData));
+            }
+            ExcelUtils.exportManySheet(response, "付款单", exportMap);
+        }
+    }
 }
diff --git a/core/service/src/main/java/com/wansenai/service/financial/impl/TransferReceiptServiceImpl.java b/core/service/src/main/java/com/wansenai/service/financial/impl/TransferReceiptServiceImpl.java
index 58bfafd26..66fa61d63 100644
--- a/core/service/src/main/java/com/wansenai/service/financial/impl/TransferReceiptServiceImpl.java
+++ b/core/service/src/main/java/com/wansenai/service/financial/impl/TransferReceiptServiceImpl.java
@@ -15,7 +15,9 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.wansenai.bo.FileDataBO;
+import com.wansenai.bo.IncomeExpenseDataExportBO;
 import com.wansenai.bo.TransferAccountBO;
+import com.wansenai.bo.TransferAccountDataExportBO;
 import com.wansenai.dto.financial.AddOrUpdateTransferDTO;
 import com.wansenai.dto.financial.QueryTransferDTO;
 import com.wansenai.entities.financial.FinancialMain;
@@ -32,11 +34,12 @@
 import com.wansenai.utils.TimeUtil;
 import com.wansenai.utils.constants.CommonConstants;
 import com.wansenai.utils.enums.BaseCodeEnum;
-import com.wansenai.utils.enums.IncomeExpenseCodeEnum;
 import com.wansenai.utils.enums.TransferAccountCodeEnum;
+import com.wansenai.utils.excel.ExcelUtils;
 import com.wansenai.utils.response.Response;
 import com.wansenai.vo.financial.TransferDetailVO;
 import com.wansenai.vo.financial.TransferVO;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -45,6 +48,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 @Service
@@ -133,6 +137,36 @@ public Response<Page<TransferVO>> getTransferReceiptPageList(QueryTransferDTO qu
         return Response.responseData(result);
     }
 
+    private List<TransferVO> getTransferReceiptList(QueryTransferDTO queryTransferDTO) {
+        var financialMainList = lambdaQuery()
+                .eq(queryTransferDTO.getFinancialPersonId() != null, FinancialMain::getOperatorId, queryTransferDTO.getFinancialPersonId())
+                .eq(queryTransferDTO.getAccountId() != null, FinancialMain::getAccountId, queryTransferDTO.getAccountId())
+                .eq(StringUtils.hasLength(queryTransferDTO.getReceiptNumber()), FinancialMain::getReceiptNumber, queryTransferDTO.getReceiptNumber())
+                .eq(queryTransferDTO.getStatus() != null, FinancialMain::getStatus, queryTransferDTO.getStatus())
+                .like(StringUtils.hasLength(queryTransferDTO.getRemark()), FinancialMain::getRemark, queryTransferDTO.getRemark())
+                .ge(StringUtils.hasLength(queryTransferDTO.getStartDate()), FinancialMain::getReceiptDate, queryTransferDTO.getStartDate())
+                .le(StringUtils.hasLength(queryTransferDTO.getEndDate()), FinancialMain::getReceiptDate, queryTransferDTO.getEndDate())
+                .eq(FinancialMain::getType, "转账")
+                .list();
+
+        var transferVOList = new ArrayList<TransferVO>(financialMainList.size() + 1);
+        financialMainList.forEach(item -> {
+            var transferVO = TransferVO.builder()
+                    .id(item.getId())
+                    .receiptNumber(item.getReceiptNumber())
+                    .receiptDate(item.getReceiptDate())
+                    .financialPerson(commonService.getOperatorName(item.getOperatorId()))
+                    .paymentAmount(item.getTotalAmount())
+                    .paymentAccountName(commonService.getAccountName(item.getAccountId()))
+                    .status(item.getStatus())
+                    .remark(item.getRemark())
+                    .build();
+
+            transferVOList.add(transferVO);
+        });
+        return transferVOList;
+    }
+
     @Override
     public Response<TransferDetailVO> getTransferReceiptDetail(Long id) {
         if (id == null) {
@@ -352,4 +386,32 @@ public Response<String> updateTransferReceiptStatus(List<Long> ids, Integer stat
         }
         return Response.responseMsg(TransferAccountCodeEnum.UPDATE_TRANSFER_ACCOUNT_RECEIPT_SUCCESS);
     }
+
+    @Override
+    public void exportTransferReceipt(QueryTransferDTO queryTransferDTO, HttpServletResponse response) {
+        var exportMap = new ConcurrentHashMap<String, List<List<Object>>>();
+        var mainData = getTransferReceiptList(queryTransferDTO);
+        if (!mainData.isEmpty()) {
+            exportMap.put("转账单", ExcelUtils.getSheetData(mainData));
+            if (queryTransferDTO.getIsExportDetail()) {
+                var subData = new ArrayList<TransferAccountDataExportBO>();
+                for (TransferVO transferVO : mainData) {
+                    var detail = getTransferReceiptDetail(transferVO.getId()).getData().getTableData();
+                    if (!detail.isEmpty()) {
+                        detail.forEach(item -> {
+                            var data = TransferAccountDataExportBO.builder()
+                                    .receiptNumber(transferVO.getReceiptNumber())
+                                    .accountName(item.getAccountName())
+                                    .transferAmount(item.getTransferAmount())
+                                    .remark(item.getRemark())
+                                    .build();
+                            subData.add(data);
+                        });
+                    }
+                }
+                exportMap.put("转账单明细", ExcelUtils.getSheetData(subData));
+            }
+            ExcelUtils.exportManySheet(response, "转账单", exportMap);
+        }
+    }
 }
diff --git a/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptPurchaseServiceImpl.java b/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptPurchaseServiceImpl.java
index 7f12e2d20..696acaaa8 100644
--- a/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptPurchaseServiceImpl.java
+++ b/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptPurchaseServiceImpl.java
@@ -1350,8 +1350,8 @@ public void exportPurchaseOrderExcel(QueryPurchaseOrderDTO queryPurchaseOrderDTO
                             subData.add(purchaseDataBo);
                         });
                     }
-                    exportMap.put("采购订单明细", ExcelUtils.getSheetData(subData));
                 }
+                exportMap.put("采购订单明细", ExcelUtils.getSheetData(subData));
             }
             exportMap.put("采购订单", ExcelUtils.getSheetData(mainData));
             ExcelUtils.exportManySheet(response, "采购订单", exportMap);
@@ -1391,8 +1391,8 @@ public void exportPurchaseStorageExcel(QueryPurchaseStorageDTO queryPurchaseStor
                             subData.add(purchaseDataBo);
                         });
                     }
-                    exportMap.put("采购入库明细", ExcelUtils.getSheetData(subData));
                 }
+                exportMap.put("采购入库明细", ExcelUtils.getSheetData(subData));
             }
             exportMap.put("采购入库", ExcelUtils.getSheetData(mainData));
             ExcelUtils.exportManySheet(response, "采购入库", exportMap);
@@ -1432,8 +1432,8 @@ public void exportPurchaseRefundExcel(QueryPurchaseRefundDTO queryPurchaseRefund
                             subData.add(purchaseDataBo);
                         });
                     }
-                    exportMap.put("采购退货明细", ExcelUtils.getSheetData(subData));
                 }
+                exportMap.put("采购退货明细", ExcelUtils.getSheetData(subData));
             }
             exportMap.put("采购退货", ExcelUtils.getSheetData(mainData));
             ExcelUtils.exportManySheet(response, "采购退货", exportMap);
diff --git a/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptSaleServiceImpl.java b/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptSaleServiceImpl.java
index fd3b16f01..30356ad32 100644
--- a/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptSaleServiceImpl.java
+++ b/core/service/src/main/java/com/wansenai/service/receipt/impl/ReceiptSaleServiceImpl.java
@@ -1355,8 +1355,8 @@ public void exportSaleOrderExcel(QuerySaleOrderDTO querySaleOrderDTO, HttpServle
                             subData.add(saleDataBo);
                         });
                     }
-                    exportMap.put("销售订单明细", ExcelUtils.getSheetData(subData));
                 }
+                exportMap.put("销售订单明细", ExcelUtils.getSheetData(subData));
             }
             exportMap.put("销售订单", ExcelUtils.getSheetData(mainData));
             ExcelUtils.exportManySheet(response, "销售订单", exportMap);
@@ -1397,8 +1397,8 @@ public void exportSaleShipmentsExcel(QuerySaleShipmentsDTO querySaleShipmentsDTO
                             subData.add(saleDataBo);
                         });
                     }
-                    exportMap.put("销售出库明细", ExcelUtils.getSheetData(subData));
                 }
+                exportMap.put("销售出库明细", ExcelUtils.getSheetData(subData));
             }
             exportMap.put("销售出库", ExcelUtils.getSheetData(mainData));
             ExcelUtils.exportManySheet(response, "销售出库", exportMap);
@@ -1439,8 +1439,8 @@ public void exportSaleRefundExcel(QuerySaleRefundDTO querySaleRefundDTO, HttpSer
                             subData.add(saleDataBo);
                         });
                     }
-                    exportMap.put("销售退货明细", ExcelUtils.getSheetData(subData));
                 }
+                exportMap.put("销售退货明细", ExcelUtils.getSheetData(subData));
             }
             exportMap.put("销售退货", ExcelUtils.getSheetData(mainData));
             ExcelUtils.exportManySheet(response, "销售退货", exportMap);
diff --git a/core/service/src/main/kotlin/com/wansenai/service/financial/AdvanceChargeService.kt b/core/service/src/main/kotlin/com/wansenai/service/financial/AdvanceChargeService.kt
index b3b68923f..e2c37c307 100644
--- a/core/service/src/main/kotlin/com/wansenai/service/financial/AdvanceChargeService.kt
+++ b/core/service/src/main/kotlin/com/wansenai/service/financial/AdvanceChargeService.kt
@@ -20,6 +20,7 @@ import com.wansenai.entities.financial.FinancialMain
 import com.wansenai.utils.response.Response
 import com.wansenai.vo.financial.AdvanceChargeDetailVO
 import com.wansenai.vo.financial.AdvanceChargeVO
+import jakarta.servlet.http.HttpServletResponse
 
 interface AdvanceChargeService : IService<FinancialMain>{
 
@@ -32,4 +33,6 @@ interface AdvanceChargeService : IService<FinancialMain>{
     fun deleteAdvanceChargeById(ids: List<Long>): Response<String>
 
     fun updateAdvanceChargeStatusById(ids: List<Long>, status: Int): Response<String>
+
+    fun exportAdvanceCharge(advanceChargeDTO: QueryAdvanceChargeDTO, response: HttpServletResponse)
 }
\ No newline at end of file
diff --git a/core/service/src/main/kotlin/com/wansenai/service/financial/impl/AdvanceChargeServiceImpl.kt b/core/service/src/main/kotlin/com/wansenai/service/financial/impl/AdvanceChargeServiceImpl.kt
index 5e9577c19..1b3e18d42 100644
--- a/core/service/src/main/kotlin/com/wansenai/service/financial/impl/AdvanceChargeServiceImpl.kt
+++ b/core/service/src/main/kotlin/com/wansenai/service/financial/impl/AdvanceChargeServiceImpl.kt
@@ -15,10 +15,10 @@ package com.wansenai.service.financial.impl
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
-import com.wansenai.entities.SysDepartment
 import com.wansenai.entities.financial.FinancialMain
 import com.wansenai.entities.financial.FinancialSub
 import com.wansenai.bo.AdvanceChargeDataBO
+import com.wansenai.bo.AdvanceChargeDataExportBO
 import com.wansenai.bo.FileDataBO
 import com.wansenai.dto.financial.AddOrUpdateAdvanceChargeDTO
 import com.wansenai.dto.financial.QueryAdvanceChargeDTO
@@ -32,29 +32,29 @@ import com.wansenai.service.basic.IOperatorService
 import com.wansenai.service.basic.MemberService
 import com.wansenai.service.financial.AdvanceChargeService
 import com.wansenai.service.financial.IFinancialAccountService
-import com.wansenai.service.system.SysDepartmentService
 import com.wansenai.service.user.ISysUserService
 import com.wansenai.utils.SnowflakeIdUtil
 import com.wansenai.utils.TimeUtil
 import com.wansenai.utils.constants.CommonConstants
 import com.wansenai.utils.enums.BaseCodeEnum
 import com.wansenai.utils.enums.FinancialCodeEnum
+import com.wansenai.utils.excel.ExcelUtils
 import com.wansenai.utils.response.Response
 import com.wansenai.vo.financial.AdvanceChargeDetailVO
 import com.wansenai.vo.financial.AdvanceChargeVO
+import jakarta.servlet.http.HttpServletResponse
 import lombok.extern.slf4j.Slf4j
 import org.springframework.stereotype.Service
 import org.springframework.transaction.annotation.Propagation
 import org.springframework.transaction.annotation.Transactional
 import java.math.BigDecimal
 import java.time.LocalDateTime
+import java.util.concurrent.ConcurrentHashMap
 
 @Service
 @Slf4j
 open class AdvanceChargeServiceImpl(
     private val baseService: com.wansenai.service.BaseService,
-    private val userDeptRelService: com.wansenai.service.user.ISysUserDeptRelService,
-    private val departmentService: SysDepartmentService,
     private val financialSubService: com.wansenai.service.financial.FinancialSubService,
     private val financialMainMapper: FinancialMainMapper,
     private val memberService: MemberService,
@@ -198,7 +198,7 @@ open class AdvanceChargeServiceImpl(
             receiptDate = this.receiptDate,
             operator = operator.name,
             financialPersonnel = financialPerson?.name ?: "",
-            memberName = member?.memberName,
+            memberName = member?.memberName ?: "",
             totalAmount = this.totalAmount,
             collectedAmount = this.changeAmount ?: BigDecimal.ZERO,
             status = this.status,
@@ -206,6 +206,29 @@ open class AdvanceChargeServiceImpl(
         )
     }
 
+    private fun getAdvanceChargeList(advanceChargeDTO: QueryAdvanceChargeDTO?): List<AdvanceChargeVO> {
+        val wrapper = LambdaQueryWrapper<FinancialMain>().apply {
+            advanceChargeDTO?.financialPersonnelId?.let { eq(FinancialMain::getOperatorId, it) }
+            advanceChargeDTO?.receiptNumber?.let { eq(FinancialMain::getReceiptNumber, it) }
+            advanceChargeDTO?.status?.let { eq(FinancialMain::getStatus, it) }
+            advanceChargeDTO?.operatorId?.let { eq(FinancialMain::getCreateBy, it) }
+            advanceChargeDTO?.remark?.let { like(FinancialMain::getRemark, it) }
+            advanceChargeDTO?.startDate?.let { ge(FinancialMain::getCreateTime, it) }
+            advanceChargeDTO?.endDate?.let { le(FinancialMain::getCreateTime, it) }
+            eq(FinancialMain::getType, "收预付款")
+            eq(FinancialMain::getDeleteFlag, CommonConstants.NOT_DELETED)
+        }
+
+        val result = financialMainMapper.selectList(wrapper)
+        return result.map { financialMain ->
+            val member = memberService.getMemberById(financialMain.relatedPersonId)
+            val operator = userService.getById(financialMain.createBy)
+            val financialPerson = operatorService.getOperatorById(financialMain.operatorId)
+
+            financialMain.toAdvanceChargeVO(member, operator, financialPerson)
+        }
+    }
+
     // Extension function, converting List to Page
     private fun <T> List<T>.toPage(total: Long, pages: Long, size: Long): Page<T> {
         return Page<T>().apply {
@@ -314,4 +337,27 @@ open class AdvanceChargeServiceImpl(
         }
         return Response.responseMsg(FinancialCodeEnum.UPDATE_ADVANCE_ERROR)
     }
+
+    override fun exportAdvanceCharge(advanceChargeDTO: QueryAdvanceChargeDTO, response: HttpServletResponse) {
+        val exportMap = ConcurrentHashMap<String, List<List<Any>>>()
+        val mainData = getAdvanceChargeList(advanceChargeDTO)
+        if (mainData.isNotEmpty()) {
+            exportMap["收预付款"] = ExcelUtils.getSheetData(mainData)
+            if (advanceChargeDTO.isExportDetail == true) {
+                val subData = mainData.flatMap { advanceChargeVO ->
+                    advanceChargeVO.id?.let { getAdvanceChargeDetailById(it) }?.data?.tableData?.map { item ->
+                        AdvanceChargeDataExportBO(
+                            memberName = advanceChargeVO.memberName,
+                            receiptNumber = advanceChargeVO.receiptNumber,
+                            accountName = item.accountName,
+                            amount = item.amount,
+                            remark = item.remark
+                        )
+                    } ?: emptyList()
+                }
+                exportMap["收预付款单据明细"] = ExcelUtils.getSheetData(subData)
+            }
+            ExcelUtils.exportManySheet(response, "收预付款", exportMap)
+        }
+    }
 }
\ No newline at end of file
diff --git a/desktop/Cargo.lock b/desktop/Cargo.lock
index ab4460703..4968d4f54 100644
--- a/desktop/Cargo.lock
+++ b/desktop/Cargo.lock
@@ -62,16 +62,6 @@ version = "1.0.75"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
 
-[[package]]
-name = "app"
-version = "0.1.0"
-dependencies = [
- "serde",
- "serde_json",
- "tauri",
- "tauri-build",
-]
-
 [[package]]
 name = "atk"
 version = "0.15.1"
@@ -601,6 +591,16 @@ version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
 
+[[package]]
+name = "eairp-desktop"
+version = "0.1.0"
+dependencies = [
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-build",
+]
+
 [[package]]
 name = "embed-resource"
 version = "2.4.0"
diff --git a/web/src/api/financial/advance.ts b/web/src/api/financial/advance.ts
index 4a789e873..7d6bcb9f5 100644
--- a/web/src/api/financial/advance.ts
+++ b/web/src/api/financial/advance.ts
@@ -13,6 +13,7 @@ enum API {
     DeleteBatch = '/financial/advance-charge/deleteByIds',
     UpdateStatus = '/financial/advance-charge/updateStatusByIds',
     GetDetail = '/financial/advance-charge/getDetailById',
+    Export = '/financial/advance-charge/export',
 }
 
 export function getAdvancePageList(params: QueryAdvanceReq, errorMode: ErrorMessageMode = 'message') {
@@ -72,4 +73,14 @@ export function getAdvanceDetail(id: number | string, mode: ErrorMessageMode = '
             errorMessageMode: mode,
         },
     );
+}
+
+export function exportAdvance(params: QueryAdvanceReq) {
+    return defHttp.get<BaseDataResp<Blob>>(
+        {
+            url: `${API.Export}`,
+            params,
+            responseType: "blob"
+        }
+    );
 }
\ No newline at end of file
diff --git a/web/src/api/financial/collection.ts b/web/src/api/financial/collection.ts
index 97927452e..6c15e4a0a 100644
--- a/web/src/api/financial/collection.ts
+++ b/web/src/api/financial/collection.ts
@@ -15,6 +15,7 @@ enum API {
     UpdateStatus = '/financial/collection/updateStatusByIds',
     GetDetail = '/financial/collection/getDetailById',
     GetArrearsPage = '/sale/arrears/pageList',
+    Export = '/financial/collection/export',
 }
 
 export function getCollectionPageList(params: QueryCollectionReq) {
@@ -75,4 +76,14 @@ export function getArrearsPageList(params: QuerySaleArrearsReq) {
             params,
         }
     );
+}
+
+export function exportCollection(params: QueryCollectionReq) {
+    return defHttp.get<BaseDataResp<Blob>>(
+        {
+            url: `${API.Export}`,
+            params,
+            responseType: "blob"
+        }
+    );
 }
\ No newline at end of file
diff --git a/web/src/api/financial/expense.ts b/web/src/api/financial/expense.ts
index 95529b09d..f533a6e9e 100644
--- a/web/src/api/financial/expense.ts
+++ b/web/src/api/financial/expense.ts
@@ -14,6 +14,7 @@ enum API {
     DeleteBatch = '/financial/expense/deleteByIds',
     UpdateStatus = '/financial/expense/updateStatusByIds',
     GetDetail = '/financial/expense/getDetailById',
+    Export = '/financial/expense/export',
 }
 
 export function getExpensePageList(params: QueryExpenseReq) {
@@ -65,4 +66,14 @@ export function getExpenseDetailById(id: number) {
             url: `${API.GetDetail}/${id}`
         },
     );
+}
+
+export function exportExpense(params: QueryExpenseReq) {
+    return defHttp.get<BaseDataResp<Blob>>(
+        {
+            url: `${API.Export}`,
+            params,
+            responseType: "blob"
+        }
+    );
 }
\ No newline at end of file
diff --git a/web/src/api/financial/income.ts b/web/src/api/financial/income.ts
index 46289141d..4114bcfc9 100644
--- a/web/src/api/financial/income.ts
+++ b/web/src/api/financial/income.ts
@@ -13,6 +13,7 @@ enum API {
     DeleteBatch = '/financial/income/deleteByIds',
     UpdateStatus = '/financial/income/updateStatusByIds',
     GetDetail = '/financial/income/getDetailById',
+    Export = '/financial/income/export',
 }
 
 export function getIncomePageList(params: QueryIncomeReq, mode: ErrorMessageMode = 'notice') {
@@ -64,4 +65,14 @@ export function getIncomeDetailById(id: number) {
             url: `${API.GetDetail}/${id}`
         },
     );
+}
+
+export function exportIncome(params: QueryIncomeReq) {
+    return defHttp.get<BaseDataResp<Blob>>(
+        {
+            url: `${API.Export}`,
+            params,
+            responseType: "blob"
+        }
+    );
 }
\ No newline at end of file
diff --git a/web/src/api/financial/payment.ts b/web/src/api/financial/payment.ts
index 631fa2246..b64f08086 100644
--- a/web/src/api/financial/payment.ts
+++ b/web/src/api/financial/payment.ts
@@ -17,6 +17,7 @@ enum API {
     UpdateStatus = '/financial/payment/updateStatusByIds',
     GetDetail = '/financial/payment/getDetailById',
     GetArrearsPage = '/purchase/arrears/pageList',
+    Export = '/financial/payment/export',
 }
 
 export function getPaymentPageList(params: QueryPaymentReq) {
@@ -77,4 +78,14 @@ export function getArrearsPageList(params: QueryPaymentArrearsReq) {
             params,
         }
     );
+}
+
+export function exportPayment(params: QueryPaymentReq) {
+    return defHttp.get<BaseDataResp<Blob>>(
+        {
+            url: `${API.Export}`,
+            params,
+            responseType: "blob"
+        }
+    );
 }
\ No newline at end of file
diff --git a/web/src/api/financial/transfer.ts b/web/src/api/financial/transfer.ts
index c8362eaf1..b99a81f24 100644
--- a/web/src/api/financial/transfer.ts
+++ b/web/src/api/financial/transfer.ts
@@ -14,6 +14,7 @@ enum API {
     DeleteBatch = '/financial/transfer/deleteByIds',
     UpdateStatus = '/financial/transfer/updateStatusByIds',
     GetDetail = '/financial/transfer/getDetailById',
+    Export = '/financial/transfer/export',
 }
 
 export function getTransferPageList(params: QueryTransferReq, mode: ErrorMessageMode = 'notice') {
@@ -65,4 +66,14 @@ export function getTransferDetailById(id: number) {
             url: `${API.GetDetail}/${id}`
         },
     );
+}
+
+export function exportTransfer(params: QueryTransferReq) {
+    return defHttp.get<BaseDataResp<Blob>>(
+        {
+            url: `${API.Export}`,
+            params,
+            responseType: "blob"
+        }
+    );
 }
\ No newline at end of file
diff --git a/web/src/views/financial/advance-charge/index.vue b/web/src/views/financial/advance-charge/index.vue
index e7e13199c..b14307bc0 100644
--- a/web/src/views/financial/advance-charge/index.vue
+++ b/web/src/views/financial/advance-charge/index.vue
@@ -4,6 +4,7 @@
       <template #toolbar>
         <a-button type="primary" @click="handleCreate"> 新增</a-button>
         <a-button type="primary" @click="handleBatchDelete"> 批量删除</a-button>
+        <a-button type="primary" @click="handleExport"> 导出</a-button>
         <a-button type="primary" @click="handleOnStatus(1)"> 批量审核</a-button>
         <a-button type="primary" @click="handleOnStatus(0)"> 批量反审核</a-button>
       </template>
@@ -39,6 +40,14 @@
         </template>
       </template>
     </BasicTable>
+    <a-modal v-model:open="openExportData" title="确认导出" :confirm-loading="confirmLoading"
+             @ok="handleExportOk" @cancel="handleExportCancel" okText="导出">
+      <div style="text-align: center">
+        <p>即将导出{{dataSum}}条数据,请耐心等待。</p>
+        <p>如需导出明细数据(可能耗时较长),请勾选下方复选框。</p>
+        <a-checkbox v-model:checked="exportDetailData">需要导出明细数据</a-checkbox>
+      </div>
+    </a-modal>
     <AdvanceChargeModal ref="advanceChargeModalRef" @cancel="handleCancel"></AdvanceChargeModal>
     <ViewAdvanceChargeModal @register="viewAdvanceChargeModalRef"/>
   </div>
@@ -52,19 +61,23 @@ import {BasicTable, TableAction, useTable} from "@/components/Table";
 import {useModal} from "@/components/Modal";
 import {useMessage} from "@/hooks/web/useMessage";
 import {columns, searchFormSchema} from "@/views/financial/advance-charge/advance.data";
-import {getAdvancePageList, deleteBatchAdvance, updateAdvanceStatus} from "@/api/financial/advance";
+import {getAdvancePageList, deleteBatchAdvance, updateAdvanceStatus, exportAdvance} from "@/api/financial/advance";
 import AdvanceChargeModal from "@/views/financial/advance-charge/components/AdvanceChargeModal.vue";
 import ViewAdvanceChargeModal from "@/views/financial/advance-charge/components/ViewAdvanceChargeModal.vue";
-import {Tag} from "ant-design-vue";
-
+import {Checkbox, Modal, Tag} from "ant-design-vue";
+import {getTimestamp} from "@/utils/dateUtil";
 export default defineComponent({
   name: 'advanceCharge',
-  components: {Tag, TableAction, BasicTable, AdvanceChargeModal, ViewAdvanceChargeModal},
+  components: {'a-modal': Modal, 'a-checkbox': Checkbox, Tag, TableAction, BasicTable, AdvanceChargeModal, ViewAdvanceChargeModal},
   setup() {
     const [viewAdvanceChargeModalRef, {openModal: openAdvanceChargeModal}] = useModal();
     const { createMessage } = useMessage();
     const advanceChargeModalRef = ref(null);
-    const [registerTable, { reload, getSelectRows }] = useTable({
+    const exportDetailData = ref<boolean>(false);
+    const openExportData = ref<boolean>(false);
+    const confirmLoading = ref<boolean>(false);
+    const dataSum = ref<number>(0);
+    const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({
       title: '收预付款列表',
       api: getAdvancePageList,
       rowKey: 'id',
@@ -151,6 +164,40 @@ export default defineComponent({
       });
     }
 
+    async function handleExport() {
+      dataSum.value = getDataSource().length;
+      if (dataSum.value === 0) {
+        createMessage.warn('当前查询条件下无数据可导出');
+        return;
+      }
+      openExportData.value = true;
+    }
+
+    const handleExportCancel = () => {
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    };
+
+    const handleExportOk = async () => {
+      confirmLoading.value = true;
+      const data: any = getForm().getFieldsValue();
+      data.isExportDetail = exportDetailData.value;
+      const file: any = await exportAdvance(data)
+      if (file.size > 0) {
+        const blob = new Blob([file]);
+        const link = document.createElement("a");
+        link.href = URL.createObjectURL(blob);
+        const timestamp = getTimestamp(new Date());
+        link.download = "收预付款单数据" + timestamp + ".xlsx";
+        link.target = "_blank";
+        link.click();
+      }
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    }
+
     return {
       registerTable,
       handleCreate,
@@ -162,7 +209,14 @@ export default defineComponent({
       handleOnStatus,
       handleCancel,
       advanceChargeModalRef,
-      viewAdvanceChargeModalRef
+      viewAdvanceChargeModalRef,
+      handleExport,
+      openExportData,
+      confirmLoading,
+      exportDetailData,
+      dataSum,
+      handleExportOk,
+      handleExportCancel
     }
   }
 })
diff --git a/web/src/views/financial/collection/index.vue b/web/src/views/financial/collection/index.vue
index 1264bdb19..3a6b0e8a5 100644
--- a/web/src/views/financial/collection/index.vue
+++ b/web/src/views/financial/collection/index.vue
@@ -40,6 +40,14 @@
         </template>
       </template>
     </BasicTable>
+    <a-modal v-model:open="openExportData" title="确认导出" :confirm-loading="confirmLoading"
+             @ok="handleExportOk" @cancel="handleExportCancel" okText="导出">
+      <div style="text-align: center">
+        <p>即将导出{{dataSum}}条数据,请耐心等待。</p>
+        <p>如需导出明细数据(可能耗时较长),请勾选下方复选框。</p>
+        <a-checkbox v-model:checked="exportDetailData">需要导出明细数据</a-checkbox>
+      </div>
+    </a-modal>
     <AddEditCollectionModal ref="addEditModalRef" @cancel="handleCancel"/>
     <ViewCollectionModal @register="receiptViewModal" />
   </div>
@@ -52,22 +60,26 @@ import {defineComponent, ref} from "vue";
 import {BasicTable, TableAction, useTable} from "@/components/Table";
 import {useMessage} from "@/hooks/web/useMessage";
 import {columns, searchFormSchema} from "@/views/financial/collection/collection.data";
-import {exportXlsx} from "@/api/basic/common";
 import {useI18n} from "vue-i18n";
-import {getCollectionPageList, deleteBatchCollection, updateCollectionStatus} from "@/api/financial/collection";
-import {Tag} from "ant-design-vue";
+import {getCollectionPageList, deleteBatchCollection, updateCollectionStatus, exportCollection} from "@/api/financial/collection";
+import {Checkbox, Modal, Tag} from "ant-design-vue";
 import {useModal} from "@/components/Modal";
 import ViewCollectionModal from "@/views/financial/collection/components/ViewCollectionModal.vue";
 import AddEditCollectionModal from "@/views/financial/collection/components/AddEditCollectionModal.vue";
+import {getTimestamp} from "@/utils/dateUtil";
 export default defineComponent({
   name: 'CollectionReceipt',
-  components: {ViewCollectionModal, Tag, TableAction, BasicTable, AddEditCollectionModal},
+  components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewCollectionModal, Tag, TableAction, BasicTable, AddEditCollectionModal},
   setup() {
     const { t } = useI18n();
     const { createMessage } = useMessage();
     const addEditModalRef = ref(null);
+    const exportDetailData = ref<boolean>(false);
+    const openExportData = ref<boolean>(false);
+    const confirmLoading = ref<boolean>(false);
+    const dataSum = ref<number>(0);
     const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal();
-    const [registerTable, { reload, getSelectRows }] = useTable({
+    const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({
       title: '收款单列表',
       rowKey: 'id',
       api: getCollectionPageList,
@@ -169,14 +181,37 @@ export default defineComponent({
     }
 
     async function handleExport() {
-      const file = await exportXlsx("收款单列表")
-      const blob = new Blob([file]);
-      const link = document.createElement("a");
-      link.href = URL.createObjectURL(blob);
-      const timestamp = getTimestamp(new Date());
-      link.download = "收款单数据" + timestamp + ".xlsx";
-      link.target = "_blank";
-      link.click();
+      dataSum.value = getDataSource().length;
+      if (dataSum.value === 0) {
+        createMessage.warn('当前查询条件下无数据可导出');
+        return;
+      }
+      openExportData.value = true;
+    }
+
+    const handleExportCancel = () => {
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    };
+
+    const handleExportOk = async () => {
+      confirmLoading.value = true;
+      const data: any = getForm().getFieldsValue();
+      data.isExportDetail = exportDetailData.value;
+      const file: any = await exportCollection(data)
+      if (file.size > 0) {
+        const blob = new Blob([file]);
+        const link = document.createElement("a");
+        link.href = URL.createObjectURL(blob);
+        const timestamp = getTimestamp(new Date());
+        link.download = "收款单数据" + timestamp + ".xlsx";
+        link.target = "_blank";
+        link.click();
+      }
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
     }
 
 
@@ -195,6 +230,12 @@ export default defineComponent({
       handleView,
       handleOk,
       handleExport,
+      openExportData,
+      confirmLoading,
+      exportDetailData,
+      dataSum,
+      handleExportOk,
+      handleExportCancel
     }
   }
 })
diff --git a/web/src/views/financial/expense/index.vue b/web/src/views/financial/expense/index.vue
index 3e9dc4ffa..694924a66 100644
--- a/web/src/views/financial/expense/index.vue
+++ b/web/src/views/financial/expense/index.vue
@@ -40,6 +40,14 @@
         </template>
       </template>
     </BasicTable>
+    <a-modal v-model:open="openExportData" title="确认导出" :confirm-loading="confirmLoading"
+             @ok="handleExportOk" @cancel="handleExportCancel" okText="导出">
+      <div style="text-align: center">
+        <p>即将导出{{dataSum}}条数据,请耐心等待。</p>
+        <p>如需导出明细数据(可能耗时较长),请勾选下方复选框。</p>
+        <a-checkbox v-model:checked="exportDetailData">需要导出明细数据</a-checkbox>
+      </div>
+    </a-modal>
     <AddEditExpenseModal ref="addEditModalRef" @cancel="handleCancel"/>
     <ViewExpenseModal @register="receiptViewModal" />
   </div>
@@ -52,22 +60,25 @@ import {defineComponent, ref} from "vue";
 import {BasicTable, TableAction, useTable} from "@/components/Table";
 import {useMessage} from "@/hooks/web/useMessage";
 import {columns, searchFormSchema} from "@/views/financial/expense/expense.data";
-import {exportXlsx} from "@/api/basic/common";
 import {useI18n} from "vue-i18n";
-import {getExpensePageList, deleteBatchExpense, updateExpenseStatus} from "@/api/financial/expense";
+import {getExpensePageList, deleteBatchExpense, updateExpenseStatus, exportExpense} from "@/api/financial/expense";
 import AddEditExpenseModal from "@/views/financial/expense/components/AddEditExpenseModal.vue"
-import {Tag} from "ant-design-vue";
+import {Checkbox, Modal, Tag} from "ant-design-vue";
 import {useModal} from "@/components/Modal";
 import ViewExpenseModal from "@/views/financial/expense/components/ViewExpenseModal.vue";
 export default defineComponent({
   name: 'ExpenseReceipt',
-  components: {ViewExpenseModal, Tag, TableAction, BasicTable, AddEditExpenseModal},
+  components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewExpenseModal, Tag, TableAction, BasicTable, AddEditExpenseModal},
   setup() {
     const { t } = useI18n();
     const { createMessage } = useMessage();
     const addEditModalRef = ref(null);
+    const exportDetailData = ref<boolean>(false);
+    const openExportData = ref<boolean>(false);
+    const confirmLoading = ref<boolean>(false);
+    const dataSum = ref<number>(0);
     const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal();
-    const [registerTable, { reload, getSelectRows }] = useTable({
+    const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({
       title: '支出单列表',
       rowKey: 'id',
       api: getExpensePageList,
@@ -169,14 +180,37 @@ export default defineComponent({
     }
 
     async function handleExport() {
-      const file = await exportXlsx("支出单列表")
-      const blob = new Blob([file]);
-      const link = document.createElement("a");
-      link.href = URL.createObjectURL(blob);
-      const timestamp = getTimestamp(new Date());
-      link.download = "支出单数据" + timestamp + ".xlsx";
-      link.target = "_blank";
-      link.click();
+      dataSum.value = getDataSource().length;
+      if (dataSum.value === 0) {
+        createMessage.warn('当前查询条件下无数据可导出');
+        return;
+      }
+      openExportData.value = true;
+    }
+
+    const handleExportCancel = () => {
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    };
+
+    const handleExportOk = async () => {
+      confirmLoading.value = true;
+      const data: any = getForm().getFieldsValue();
+      data.isExportDetail = exportDetailData.value;
+      const file: any = await exportExpense(data)
+      if (file.size > 0) {
+        const blob = new Blob([file]);
+        const link = document.createElement("a");
+        link.href = URL.createObjectURL(blob);
+        const timestamp = getTimestamp(new Date());
+        link.download = "支出单数据" + timestamp + ".xlsx";
+        link.target = "_blank";
+        link.click();
+      }
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
     }
 
 
@@ -195,6 +229,12 @@ export default defineComponent({
       handleView,
       handleOk,
       handleExport,
+      openExportData,
+      confirmLoading,
+      exportDetailData,
+      dataSum,
+      handleExportOk,
+      handleExportCancel
     }
   }
 })
diff --git a/web/src/views/financial/income/index.vue b/web/src/views/financial/income/index.vue
index 0ec031c6d..57db71d11 100644
--- a/web/src/views/financial/income/index.vue
+++ b/web/src/views/financial/income/index.vue
@@ -40,6 +40,14 @@
         </template>
       </template>
     </BasicTable>
+    <a-modal v-model:open="openExportData" title="确认导出" :confirm-loading="confirmLoading"
+             @ok="handleExportOk" @cancel="handleExportCancel" okText="导出">
+      <div style="text-align: center">
+        <p>即将导出{{dataSum}}条数据,请耐心等待。</p>
+        <p>如需导出明细数据(可能耗时较长),请勾选下方复选框。</p>
+        <a-checkbox v-model:checked="exportDetailData">需要导出明细数据</a-checkbox>
+      </div>
+    </a-modal>
     <AddEditIncomeModal ref="addEditModalRef" @cancel="handleCancel"/>
     <ViewIncomeModal @register="receiptViewModal" />
   </div>
@@ -52,22 +60,25 @@ import {defineComponent, ref} from "vue";
 import {BasicTable, TableAction, useTable} from "@/components/Table";
 import {useMessage} from "@/hooks/web/useMessage";
 import {columns, searchFormSchema} from "@/views/financial/income/income.data";
-import {exportXlsx} from "@/api/basic/common";
 import {useI18n} from "vue-i18n";
-import {getIncomePageList, deleteBatchIncome, updateIncomeStatus} from "@/api/financial/income";
+import {getIncomePageList, deleteBatchIncome, updateIncomeStatus, exportIncome} from "@/api/financial/income";
 import AddEditIncomeModal from "@/views/financial/income/components/AddEditIncomeModal.vue"
-import {Tag} from "ant-design-vue";
+import {Checkbox, Modal, Tag} from "ant-design-vue";
 import {useModal} from "@/components/Modal";
 import ViewIncomeModal from "@/views/financial/income/components/ViewIncomeModal.vue";
 export default defineComponent({
   name: 'IncomeReceipt',
-  components: {ViewIncomeModal, Tag, TableAction, BasicTable, AddEditIncomeModal},
+  components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewIncomeModal, Tag, TableAction, BasicTable, AddEditIncomeModal},
   setup() {
     const { t } = useI18n();
     const { createMessage } = useMessage();
     const addEditModalRef = ref(null);
+    const exportDetailData = ref<boolean>(false);
+    const openExportData = ref<boolean>(false);
+    const confirmLoading = ref<boolean>(false);
+    const dataSum = ref<number>(0);
     const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal();
-    const [registerTable, { reload, getSelectRows }] = useTable({
+    const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({
       title: '收入单列表',
       rowKey: 'id',
       api: getIncomePageList,
@@ -169,16 +180,38 @@ export default defineComponent({
     }
 
     async function handleExport() {
-      const file = await exportXlsx("收入单列表")
-      const blob = new Blob([file]);
-      const link = document.createElement("a");
-      link.href = URL.createObjectURL(blob);
-      const timestamp = getTimestamp(new Date());
-      link.download = "收入单数据" + timestamp + ".xlsx";
-      link.target = "_blank";
-      link.click();
+      dataSum.value = getDataSource().length;
+      if (dataSum.value === 0) {
+        createMessage.warn('当前查询条件下无数据可导出');
+        return;
+      }
+      openExportData.value = true;
     }
 
+    const handleExportCancel = () => {
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    };
+
+    const handleExportOk = async () => {
+      confirmLoading.value = true;
+      const data: any = getForm().getFieldsValue();
+      data.isExportDetail = exportDetailData.value;
+      const file: any = await exportIncome(data)
+      if (file.size > 0) {
+        const blob = new Blob([file]);
+        const link = document.createElement("a");
+        link.href = URL.createObjectURL(blob);
+        const timestamp = getTimestamp(new Date());
+        link.download = "收入单数据" + timestamp + ".xlsx";
+        link.target = "_blank";
+        link.click();
+      }
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    }
 
     return {
       t,
@@ -195,6 +228,12 @@ export default defineComponent({
       handleView,
       handleOk,
       handleExport,
+      openExportData,
+      confirmLoading,
+      exportDetailData,
+      dataSum,
+      handleExportOk,
+      handleExportCancel
     }
   }
 })
diff --git a/web/src/views/financial/payment/index.vue b/web/src/views/financial/payment/index.vue
index d9c02371b..cdc87bd19 100644
--- a/web/src/views/financial/payment/index.vue
+++ b/web/src/views/financial/payment/index.vue
@@ -40,6 +40,14 @@
         </template>
       </template>
     </BasicTable>
+    <a-modal v-model:open="openExportData" title="确认导出" :confirm-loading="confirmLoading"
+             @ok="handleExportOk" @cancel="handleExportCancel" okText="导出">
+      <div style="text-align: center">
+        <p>即将导出{{dataSum}}条数据,请耐心等待。</p>
+        <p>如需导出明细数据(可能耗时较长),请勾选下方复选框。</p>
+        <a-checkbox v-model:checked="exportDetailData">需要导出明细数据</a-checkbox>
+      </div>
+    </a-modal>
     <AddEditPaymentModal ref="addEditModalRef" @cancel="handleCancel"/>
     <ViewPaymentModal @register="receiptViewModal" />
   </div>
@@ -52,22 +60,25 @@ import {defineComponent, ref} from "vue";
 import {BasicTable, TableAction, useTable} from "@/components/Table";
 import {useMessage} from "@/hooks/web/useMessage";
 import {columns, searchFormSchema} from "@/views/financial/payment/payment.data";
-import {exportXlsx} from "@/api/basic/common";
 import {useI18n} from "vue-i18n";
-import {getPaymentPageList, deleteBatchPayment, updatePaymentStatus} from "@/api/financial/payment";
-import {Tag} from "ant-design-vue";
+import {getPaymentPageList, deleteBatchPayment, updatePaymentStatus, exportPayment} from "@/api/financial/payment";
+import {Checkbox, Modal, Tag} from "ant-design-vue";
 import {useModal} from "@/components/Modal";
 import ViewPaymentModal from "@/views/financial/payment/components/ViewPaymentModal.vue";
 import AddEditPaymentModal from "@/views/financial/payment/components/AddEditPaymentModal.vue";
 export default defineComponent({
   name: 'PaymentReceipt',
-  components: {ViewPaymentModal, Tag, TableAction, BasicTable, AddEditPaymentModal},
+  components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewPaymentModal, Tag, TableAction, BasicTable, AddEditPaymentModal},
   setup() {
     const { t } = useI18n();
     const { createMessage } = useMessage();
     const addEditModalRef = ref(null);
+    const exportDetailData = ref<boolean>(false);
+    const openExportData = ref<boolean>(false);
+    const confirmLoading = ref<boolean>(false);
+    const dataSum = ref<number>(0);
     const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal();
-    const [registerTable, { reload, getSelectRows }] = useTable({
+    const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({
       title: '付款单列表',
       rowKey: 'id',
       api: getPaymentPageList,
@@ -169,16 +180,38 @@ export default defineComponent({
     }
 
     async function handleExport() {
-      const file = await exportXlsx("付款单列表")
-      const blob = new Blob([file]);
-      const link = document.createElement("a");
-      link.href = URL.createObjectURL(blob);
-      const timestamp = getTimestamp(new Date());
-      link.download = "付款单数据" + timestamp + ".xlsx";
-      link.target = "_blank";
-      link.click();
+      dataSum.value = getDataSource().length;
+      if (dataSum.value === 0) {
+        createMessage.warn('当前查询条件下无数据可导出');
+        return;
+      }
+      openExportData.value = true;
     }
 
+    const handleExportCancel = () => {
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    };
+
+    const handleExportOk = async () => {
+      confirmLoading.value = true;
+      const data: any = getForm().getFieldsValue();
+      data.isExportDetail = exportDetailData.value;
+      const file: any = await exportPayment(data)
+      if (file.size > 0) {
+        const blob = new Blob([file]);
+        const link = document.createElement("a");
+        link.href = URL.createObjectURL(blob);
+        const timestamp = getTimestamp(new Date());
+        link.download = "付款单数据" + timestamp + ".xlsx";
+        link.target = "_blank";
+        link.click();
+      }
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    }
 
     return {
       t,
@@ -195,6 +228,12 @@ export default defineComponent({
       handleView,
       handleOk,
       handleExport,
+      openExportData,
+      confirmLoading,
+      exportDetailData,
+      dataSum,
+      handleExportOk,
+      handleExportCancel
     }
   }
 })
diff --git a/web/src/views/financial/payment/payment.data.ts b/web/src/views/financial/payment/payment.data.ts
index 521786124..d932d73d9 100644
--- a/web/src/views/financial/payment/payment.data.ts
+++ b/web/src/views/financial/payment/payment.data.ts
@@ -6,7 +6,7 @@ import {getOperatorList} from "@/api/basic/operator";
 
 export const columns: BasicColumn[] = [
     {
-        title: '客户',
+        title: '供应商',
         dataIndex: 'supplierName',
         width: 120,
     },
diff --git a/web/src/views/financial/transfer/index.vue b/web/src/views/financial/transfer/index.vue
index c6af39641..9b014a69f 100644
--- a/web/src/views/financial/transfer/index.vue
+++ b/web/src/views/financial/transfer/index.vue
@@ -40,6 +40,14 @@
         </template>
       </template>
     </BasicTable>
+    <a-modal v-model:open="openExportData" title="确认导出" :confirm-loading="confirmLoading"
+             @ok="handleExportOk" @cancel="handleExportCancel" okText="导出">
+      <div style="text-align: center">
+        <p>即将导出{{dataSum}}条数据,请耐心等待。</p>
+        <p>如需导出明细数据(可能耗时较长),请勾选下方复选框。</p>
+        <a-checkbox v-model:checked="exportDetailData">需要导出明细数据</a-checkbox>
+      </div>
+    </a-modal>
     <AddEditTransferModal ref="addEditModalRef" @cancel="handleCancel"/>
     <ViewTransferModal @register="receiptViewModal" />
   </div>
@@ -52,22 +60,25 @@ import {defineComponent, ref} from "vue";
 import {BasicTable, TableAction, useTable} from "@/components/Table";
 import {useMessage} from "@/hooks/web/useMessage";
 import {columns, searchFormSchema} from "@/views/financial/transfer/transfer.data";
-import {exportXlsx} from "@/api/basic/common";
 import {useI18n} from "vue-i18n";
-import {getTransferPageList, deleteBatchTransfer, updateTransferStatus} from "@/api/financial/transfer";
-import {Tag} from "ant-design-vue";
+import {getTransferPageList, deleteBatchTransfer, updateTransferStatus, exportTransfer} from "@/api/financial/transfer";
+import {Checkbox, Modal, Tag} from "ant-design-vue";
 import {useModal} from "@/components/Modal";
 import ViewTransferModal from "@/views/financial/transfer/components/ViewTransferModal.vue";
 import AddEditTransferModal from "@/views/financial/transfer/components/AddEditTransferModal.vue"
 export default defineComponent({
   name: 'TransferReceipt',
-  components: {ViewTransferModal, Tag, TableAction, BasicTable, AddEditTransferModal},
+  components: {'a-modal': Modal, 'a-checkbox': Checkbox, ViewTransferModal, Tag, TableAction, BasicTable, AddEditTransferModal},
   setup() {
     const { t } = useI18n();
     const { createMessage } = useMessage();
     const addEditModalRef = ref(null);
+    const exportDetailData = ref<boolean>(false);
+    const openExportData = ref<boolean>(false);
+    const confirmLoading = ref<boolean>(false);
+    const dataSum = ref<number>(0);
     const [receiptViewModal, {openModal: openReceiptViewModal}] = useModal();
-    const [registerTable, { reload, getSelectRows }] = useTable({
+    const [registerTable, { reload, getSelectRows, getForm, getDataSource }] = useTable({
       title: '转账单列表',
       rowKey: 'id',
       api: getTransferPageList,
@@ -169,16 +180,38 @@ export default defineComponent({
     }
 
     async function handleExport() {
-      const file = await exportXlsx("转账单列表")
-      const blob = new Blob([file]);
-      const link = document.createElement("a");
-      link.href = URL.createObjectURL(blob);
-      const timestamp = getTimestamp(new Date());
-      link.download = "转账单数据" + timestamp + ".xlsx";
-      link.target = "_blank";
-      link.click();
+      dataSum.value = getDataSource().length;
+      if (dataSum.value === 0) {
+        createMessage.warn('当前查询条件下无数据可导出');
+        return;
+      }
+      openExportData.value = true;
     }
 
+    const handleExportCancel = () => {
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    };
+
+    const handleExportOk = async () => {
+      confirmLoading.value = true;
+      const data: any = getForm().getFieldsValue();
+      data.isExportDetail = exportDetailData.value;
+      const file: any = await exportTransfer(data)
+      if (file.size > 0) {
+        const blob = new Blob([file]);
+        const link = document.createElement("a");
+        link.href = URL.createObjectURL(blob);
+        const timestamp = getTimestamp(new Date());
+        link.download = "转账单数据" + timestamp + ".xlsx";
+        link.target = "_blank";
+        link.click();
+      }
+      confirmLoading.value = false;
+      openExportData.value = false;
+      exportDetailData.value = false;
+    }
 
     return {
       t,
@@ -195,6 +228,12 @@ export default defineComponent({
       handleView,
       handleOk,
       handleExport,
+      openExportData,
+      confirmLoading,
+      exportDetailData,
+      dataSum,
+      handleExportOk,
+      handleExportCancel
     }
   }
 })