java apache poi 导出word的zip包

生成word文件,包含合并单元格、调整列宽、插入嵌套表格;

将多个word文件打包生成zip文件

public void exportSummary(HttpServletResponse response, String treeId) throws IOException {
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("utf-8");
        PerformanceJob job = evaluationProgressService.genJobBytreeId(treeId);
        Assert.isTrue(job.getIsUpdatedScore(), "未更新分数或发布成绩");
        String zipFileName = URLEncoder.encode(job.getName() + "总结" + DateUtil.now(), "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + zipFileName + ".zip");
        List<SummaryProgress> summaryProgressList = summaryProgressService.findAllList(QSummaryProgress.summaryProgress.performanceJob.id.eq(job.getId())
                .and(QSummaryProgress.summaryProgress.state.eq(JobStateEnum.COMPLETED.name())));
        List<Map<Object, Object>> summaryProgressMapList = new ArrayList<>();
        List<File> summayFileList = new ArrayList<>();
        // 创建压缩目录
        String path = Constants.UPLOAD_DIR + File.separator + job.getName() + File.separator + System.currentTimeMillis();
        File dir = new File(path);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 生成word模板可替换参数map集合
        for (SummaryProgress progress : summaryProgressList) {
            // 文件名
            String fileName = progress.getExaminee().getUsername() + ".docx";
            // 标题1
            String title1 = "考核表";
            // 考核年度
            Integer year = progress.getEvaluationYear();
            String title2 = "(" + year + "年度:" + year + "年度职能员工绩效考核)";
            // 姓名
            String username = progress.getExaminee().getUsername();
            // 部门
            String deptName = progress.getExaminee().getDept().getName();
            // 职务
            String zhiwu = StringUtils.join(progress.getExaminee().getJobs().stream().map(Job::getName).collect(Collectors.toSet()), ",");
            // 总结第一段内容
            String mainContent = progress.getSummaryContentMain();
            // 总结第二段内容
            String secondContent = progress.getSummaryContentSecondary();
            // 总结第三段内容
            String thirdContent = progress.getSummaryContentThird();
            // 任务完成不理想的原因,三行复选框 + 文本:其他原因
            String checkedReasons = progress.getCheckedReasons();
            StringBuffer resultCheckedReasons = new StringBuffer();
            for (int i = 0; i < otherReasonCheckBox.size(); i++) {
                String reason = otherReasonCheckBox.get(i);
                if (i != 0 && i != 3 && i != 7) {
                    resultCheckedReasons.append("  ");
                }
                if (StringUtils.isNotBlank(checkedReasons) && checkedReasons.contains(reason)) {
                    resultCheckedReasons.append("☑").append(reason);
                } else {
                    resultCheckedReasons.append("□").append(reason);
                }
                if (i == 2 || i == 6) {
                    resultCheckedReasons.append("\n");
                }
            }
            // 其他原因
            String otherReasons = progress.getOtherReasons();
            resultCheckedReasons.append("     其他原因:").append(otherReasons == null ? "" : otherReasons);
            // 综合考评结果
            JSONObject summaryDetailJson = summaryProgressService.detail(QSummaryProgress.summaryProgress.id.eq(progress.getId()));
            JSONArray indicatorResultArr = summaryDetailJson.getJSONArray("indicatorScoreList");
            // 总结提交时限
            String closeTime = DateUtil.format(progress.getPerformanceJob().getSummaryCloseTime(), "yyyy-MM-dd");
            Map<Object, Object> map = new HashMap<>();
            map.put("fileName", fileName);
            map.put("year", year);
            map.put("title1", title1);
            map.put("title2", title2);
            map.put("username", username);
            map.put("deptFullName", deptName);
            map.put("zhiwu", zhiwu);
            map.put("mainContent", mainContent);
            map.put("secondContent", secondContent);
            map.put("thirdContent", thirdContent);
            map.put("resultCheckedReasons", resultCheckedReasons.toString());
            map.put("indicatorResultArr", indicatorResultArr);
            map.put("closeTime", closeTime);
            summaryProgressMapList.add(map);
        }
        for (Map<Object, Object> objectObjectMap : summaryProgressMapList) {
            // 创建文件
            String fileName = (String) objectObjectMap.get("fileName");
            fileName = dir + File.separator + fileName;
            File zongjieFile = new File(fileName);
            if (!zongjieFile.exists()) {
                zongjieFile.createNewFile();
            }
            summayFileList.add(zongjieFile);
            XWPFDocument doc = new XWPFDocument();
            XWPFParagraph p1 = doc.createParagraph();
            p1.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun r1 = p1.createRun();
            r1.setBold(true);
            r1.setFontFamily("宋体");
            r1.setFontSize(18);
            r1.setText((String) objectObjectMap.get("title1"));
            r1.addBreak();
            XWPFParagraph p2 = doc.createParagraph();
            p2.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun r2 = p2.createRun();
            r2.setBold(true);
            r2.setFontFamily("宋体");
            r2.setFontSize(16);
            r2.setText((String) objectObjectMap.get("title2"));
            r2.addBreak();
            XWPFParagraph p3 = doc.createParagraph();
            p3.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun r3 = p3.createRun();
            r3.setBold(true);
            r3.setFontFamily("宋体");
            r3.setFontSize(10);
            StringBuffer line3 = new StringBuffer();
            line3.append("姓名:").append(objectObjectMap.get("username")).append("  ")
                    .append("部门:").append(objectObjectMap.get("deptName")).append("  ")
                    .append("职务:").append(objectObjectMap.get("zhiwu"));
            r3.setText(line3.toString());
            r3.addBreak();
            XWPFTable table = doc.createTable(11, 2);
            // 设置行高
            table.getRows().forEach(row -> row.setHeight(400));
            // 设置表格宽度
            table.setWidth("130%");
            table.setTableAlignment(TableRowAlign.CENTER);
            int tableWidth = (int) (table.getWidth() * 1.3);
            XWPFTableCell row13Cell0 = table.getRow(0).getCell(0);
            //设置单元格宽度
            CTTcPr tcpr = row13Cell0.getCTTc().addNewTcPr();
            CTTblWidth cellW = tcpr.addNewTcW();
            cellW.setType(STTblWidth.DXA);
            cellW.setW(BigInteger.valueOf((long) (tableWidth * 0.8)));
            XWPFTableCell row13Cell1 = table.getRow(0).getCell(1);
            //设置单元格宽度
            CTTcPr tcpr1 = row13Cell1.getCTTc().addNewTcPr();
            CTTblWidth cellW1 = tcpr1.addNewTcW();
            cellW1.setType(STTblWidth.DXA);
            cellW1.setW(BigInteger.valueOf((long) (tableWidth * 0.2)));
            // 第一行
            XWPFParagraph tableP1 = table.getRow(0).getCell(0).getParagraphs().get(0);
            tableP1.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableR1 = tableP1.createRun();
            tableR1.setText("列举工作任务");
            setBoldRunStyle(tableR1,true);
            XWPFRun tableR11 = tableP1.createRun();
            tableR11.setText("(注明角色等)");
            setBoldRunStyle(tableR11, false);
            mergeTableCellH(table, 0, 0);
            // 第二行
            table.getRow(1).getCell(0).setText((String) objectObjectMap.get("mainContent"));
            mergeTableCellH(table, 1, 0);
            // 第三行
            XWPFTableCell row3Cell0 = table.getRow(2).getCell(0);
            XWPFParagraph tableP3 = row3Cell0.getParagraphs().get(0);
            tableP3.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP3Run = tableP3.createRun();
            tableP3Run.setText("任务完成不理想的原因(请在相应的□内划“√”)");
            tableP3Run.addBreak();
            setBoldRunStyle(tableP3Run, true);
            mergeTableCellH(table, 2, 0);
            String resultCheckedReasonsStr = (String) objectObjectMap.get("resultCheckedReasons");
            String[] cell3StrArr = resultCheckedReasonsStr.split("\n");
            for (String s : cell3StrArr) {
                XWPFParagraph row3Paragraph = row3Cell0.addParagraph();
                XWPFRun row4CellRun = row3Paragraph.createRun();
                row4CellRun.setText(s);
                setBoldRunStyle(row4CellRun, false);
                row4CellRun.addBreak(BreakType.COLUMN);
            }
            // 第四行
            XWPFParagraph tableP5 = table.getRow(3).getCell(0).getParagraphs().get(0);
            tableP5.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP5Run = tableP5.createRun();
            tableP5Run.setText("其他原因");
            setBoldRunStyle(tableP5Run, true);
            mergeTableCellH(table, 3, 0);
            // 第五行
            table.getRow(4).getCell(0).setText((String) objectObjectMap.get("secondContent"));
            mergeTableCellH(table, 4, 0);
            // 第六行
            XWPFParagraph tableP7 = table.getRow(5).getCell(0).getParagraphs().get(0);
            tableP7.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP7Run = tableP7.createRun();
            tableP7Run.setText("对部门或公司的意见及建议");
            setBoldRunStyle(tableP7Run, true);
            mergeTableCellH(table, 5, 0);
            // 第七行
            table.getRow(6).getCell(0).setText((String) objectObjectMap.get("thirdContent"));
            mergeTableCellH(table, 6, 0);
            // 第八行
            XWPFParagraph tableP9 = table.getRow(7).getCell(0).getParagraphs().get(0);
            tableP9.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP9Run = tableP9.createRun();
            tableP9Run.setText("综合考评结果");
            setBoldRunStyle(tableP9Run, true);
            XWPFRun tableP91Run = tableP9.createRun();
            tableP91Run.setText("(由人力资源部填写)");
            tableP91Run.setFontFamily("宋体");
            tableP91Run.setFontSize(10);
            mergeTableCellH(table, 7, 0);
            // 第九行
            mergeTableCellH(table, 8, 0);
            XWPFTableRow row10 = table.getRow(8);
            row10.getCtRow().addNewTrPr().addNewTrHeight().setVal(BigInteger.valueOf(2000));
            // 获取游标
            XWPFTableCell cell9 = table.getRow(8).getCell(0);
            XmlCursor c = cell9.addParagraph().getCTP().newCursor();
            // 游标下移
            c.toNextSibling();
            // 插入表格
            XWPFTable cellTable = cell9.insertNewTbl(c);
            // 设置表格边框
            CTTblBorders borders=cellTable.getCTTbl().addNewTblPr().addNewTblBorders();
            CTBorder hBorder=borders.addNewInsideH();
            hBorder.setVal(STBorder.Enum.forString("single"));
            hBorder.setSz(new BigInteger("1"));
            CTBorder vBorder=borders.addNewInsideV();
            vBorder.setVal(STBorder.Enum.forString("single"));
            vBorder.setSz(new BigInteger("1"));
            CTBorder topBorder=borders.addNewTop();
            topBorder.setVal(STBorder.Enum.forString("single"));
            topBorder.setSz(new BigInteger("1"));
            CTBorder bottomBorder=borders.addNewBottom();
            bottomBorder.setVal(STBorder.Enum.forString("single"));
            bottomBorder.setSz(new BigInteger("1"));
            CTBorder leftBorder=borders.addNewLeft();
            leftBorder.setVal(STBorder.Enum.forString("single"));
            leftBorder.setSz(new BigInteger("1"));
            CTBorder rightBorder=borders.addNewRight();
            rightBorder.setVal(STBorder.Enum.forString("single"));
            rightBorder.setSz(new BigInteger("1"));
            // 设置表格宽度
            CTTblWidth cellTableWidth = cellTable.getCTTbl().getTblPr().addNewTblW();
            cellTableWidth.setW(BigInteger.valueOf((long) (table.getWidth() * 1.3 * 0.9)));
            cellTable.setTableAlignment(TableRowAlign.CENTER);
            // 这个表格第一行不能使用,删除掉
            cellTable.removeRow(0);
            // 嵌套表格第一行
            XWPFTableRow tableRow131 = cellTable.createRow();
            // 嵌套表格第二行
            XWPFTableRow tableRow132 = cellTable.createRow();
            JSONArray indicatorResultArr = (JSONArray) objectObjectMap.get("indicatorResultArr");
            for (int i = 0; i < indicatorResultArr.size(); i++) {
                JSONObject jsonObject = indicatorResultArr.getJSONObject(i);
                String cellTitle = jsonObject.getString("name");
                if (!cellTitle.equals("实际得分")) {
                    // 嵌套表格 指标实际得分第一行
                    //设置单元格宽度
                    XWPFTableCell cellI = tableRow131.createCell();
                    CTTcPr cellITcpr = cellI.getCTTc().addNewTcPr();
                    CTTblWidth cellIW = cellITcpr.addNewTcW();
                    cellIW.setType(STTblWidth.DXA);
                    cellIW.setW(BigInteger.valueOf(3000));
                    XWPFParagraph nestedTableR1 = cellI.getParagraphs().get(0);
                    nestedTableR1.setAlignment(ParagraphAlignment.CENTER);
                    XWPFRun nestedTableR1Run = nestedTableR1.createRun();
                    if (cellTitle.equals("最终考核得分") || cellTitle.equals("等级")) {
                        nestedTableR1Run.setText(cellTitle);
                    } else {
                        nestedTableR1Run.setText(cellTitle + "(" + jsonObject.getString("indicatorWeight") + "%)");
                    }
                    setBoldRunStyle(nestedTableR1Run, false);
                    // 嵌套表格 指标实际得分第二行
                    XWPFTableCell cellI1 = tableRow132.createCell();
                    CTTcPr cellI1Tcpr = cellI1.getCTTc().addNewTcPr();
                    CTTblWidth cellI1W = cellI1Tcpr.addNewTcW();
                    cellI1W.setType(STTblWidth.DXA);
                    cellI1W.setW(BigInteger.valueOf(3000));
                    XWPFParagraph nestedTableR11 = cellI1.getParagraphs().get(0);
                    nestedTableR11.setAlignment(ParagraphAlignment.CENTER);
                    XWPFRun nestedTableR11Run = nestedTableR11.createRun();
                    if (jsonObject.getBoolean("published")) {
                        if (!cellTitle.equals("等级")) {
                            nestedTableR11Run.setText(jsonObject.getBigDecimal("score").toString());
                        } else {
                            nestedTableR11Run.setText(jsonObject.getString("scoreRateName"));
                        }
                    } else {
                        nestedTableR11Run.setText("未发布");
                    }
                    setBoldRunStyle(nestedTableR11Run, false);
                }
            }
            // 第九行
            XWPFParagraph tableP11 = cell9.getParagraphs().get(1);
            tableP11.setAlignment(ParagraphAlignment.CENTER);
            tableP11.setVerticalAlignment(TextAlignment.BOTTOM);
            XWPFRun tableP11Run = tableP11.createRun();
            tableP11Run.addBreak();
            tableP11Run.addBreak();
            tableP11Run.addBreak();
            tableP11Run.addBreak();
            tableP11Run.setText("人力资源部(章)                年   月   日");
            setBoldRunStyle(tableP11Run, false);
            mergeTableCellH(table, 8, 0);
            // 第十行
            XWPFParagraph tableP12 = table.getRow(9).getCell(0).getParagraphs().get(0);
            tableP12.setAlignment(ParagraphAlignment.CENTER);
            tableP12.setVerticalAlignment(TextAlignment.BOTTOM);
            XWPFRun tableP12Run = tableP12.createRun();
            tableP12Run.setText("部门负责人反馈意见");
            setBoldRunStyle(tableP12Run, true);
            XWPFParagraph tableP121 = table.getRow(9).getCell(1).getParagraphs().get(0);
            tableP121.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP121Run = tableP121.createRun();
            tableP121Run.setText("被考核人反馈后签字");
            setBoldRunStyle(tableP121Run, true);
            // 第十一行
            // 设置行高
            // 设置单元格高度
            XWPFTableRow row13 = table.getRow(10);
            row13.getCtRow().addNewTrPr().addNewTrHeight().setVal(BigInteger.valueOf(1500));
            // 第十一行
            XWPFTableCell row14cell0 = row13.getCell(0);
            table.getRow(10).getCell(0).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.BOTTOM);
            XWPFParagraph tableP14 = row14cell0.getParagraphs().get(0);
            tableP14.setAlignment(ParagraphAlignment.LEFT);
            tableP14.setVerticalAlignment(TextAlignment.BOTTOM);
            XWPFRun tableP14Run = tableP14.createRun();
            tableP14Run.setText("领导签字:                      年   月   日");
            setBoldRunStyle(tableP14Run, false);
            XWPFParagraph tableP141 = table.getRow(10).getCell(1).getParagraphs().get(0);
            table.getRow(10).getCell(1).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.BOTTOM);
            tableP141.setAlignment(ParagraphAlignment.CENTER);
            tableP141.setVerticalAlignment(TextAlignment.BOTTOM);
            XWPFRun tableP141Run = tableP141.createRun();
            tableP141Run.setText("年   月   日");
            setBoldRunStyle(tableP141Run, false);
            XWPFParagraph plast = doc.createParagraph();
            plast.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun plastRun = plast.createRun();
            plastRun.setFontFamily("宋体");
            plastRun.setFontSize(9);
            String lastString = "注:归入本人档案。";
            lastString = MessageFormat.format(lastString, objectObjectMap.get("closeTime"));
            plastRun.setText(lastString);
            // 写入
            FileOutputStream zongjieOs = new FileOutputStream(zongjieFile);
            doc.write(zongjieOs);
            zongjieOs.close();
            doc.close();
        }
        ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
        try {
            for (File srcFile : summayFileList) {
                int len;
                zos.putNextEntry(new ZipEntry(srcFile.getName()));
                FileInputStream in = new FileInputStream(srcFile);
                byte[] buf = new byte[1024];
                while ((len = in.read(buf)) != -1) {
                    zos.write(buf, 0, len);
                }
                zos.closeEntry();
            }
        } finally {
            try {
                zos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java可以使用POI库来进行Word文档的操作,ZipFile类来进行压缩文件的操作。具体步骤如下: 1. 首先,将要导出的数据存储到一个List中。 2. 使用POI库来创建一个新的Word文档,并将List中的每一条数据依次插入到Word文档中,形成一个单独的Word文档。 3. 将每个单独的Word文档保存为.doc或.docx格式的文件。 4. 使用ZipFile类将所有的Word文档压缩成一个.zip文件。 5. 把.zip文件发送给需要的人或存储到指定的位置。 这个过程需要使用到Java的IO操作,例如FileInputStream、FileOutputStream、ZipOutputStream等类来实现,还需要学习JavaPOIZipFile类的使用方法。总体来说,这个过程需要一定的Java编程基础,但是学起来并不难,只要按照步骤一步一步来,就可以完成这个导出数据的过程。 ### 回答2: Java可以使用Apache POI库来实现将数据导出Word文档。使用POI库可以创建Word文档、给文档添加表格、样式、图片、超链接等内容,并且可以将文档保存为doc或docx格式。 要实现将每一条数据导出为单独的Word文档,可以使用循环和条件语句来遍历数据,并通过POI库将数据添加到新建的Word文档中,最后保存为单独的文档。要将这些单独的Word文档压缩成一个ZIP文件,可以使用JavaZipOutputStream类,该类可以将多个文件压缩成一个ZIP文件。 具体实现中,首先要引入POI库和ZipOutputStream类所需要的依赖,然后通过循环遍历数据,将每一条数据添加到新建的Word文档中,并保存为单独的Word文件。最后,将这些单独的Word文件通过ZipOutputStream类压缩成一个ZIP文件。实现的代码可以参考以下示例: ``` import java.io.*; import java.util.zip.*; import org.apache.poi.xwpf.usermodel.*; public class WordExport { private final static String FILE_PATH = "data/"; // Word文件保存路径 private final static String ZIP_FILE_NAME = "data.zip"; // 压缩后的ZIP文件名 public static void main(String[] args) throws IOException { // 待导出的数据 String[] data = {"数据1", "数据2", "数据3"}; // 创建ZipOutputStream对象 ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(FILE_PATH + ZIP_FILE_NAME)); // 遍历数据,将每个数据导出为单独的Word文件,并压缩到ZIP文件中 for (int i = 0; i < data.length; i++) { // 新建Word文档 XWPFDocument document = new XWPFDocument(); // 添加数据到文档中 XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText(data[i]); // 保存Word文档 FileOutputStream fos = new FileOutputStream(FILE_PATH + "data" + (i + 1) + ".docx"); document.write(fos); fos.close(); // 压缩Word文件到ZIP文件中 FileInputStream fis = new FileInputStream(FILE_PATH + "data" + (i + 1) + ".docx"); zos.putNextEntry(new ZipEntry("data" + (i + 1) + ".docx")); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zos.write(buffer, 0, len); } zos.closeEntry(); fis.close(); } // 关闭ZipOutputStream流 zos.close(); } } ``` 上述代码中,首先定义了Word文件保存路径和压缩后的ZIP文件名。然后通过遍历待导出的数据,将每个数据添加到新建的Word文档中,并保存为单独的Word文件,在保存Word文件后,将每个Word文件通过ZipOutputStream类压缩到ZIP文件中。遍历结束后,关闭ZipOutputStream流,导出和压缩过程完成。 ### 回答3: Java可以通过Apache POI库来实现将数据导出Word文档的功能,Apache POI库提供了一些API,可以很方便地创建并编辑Word文档。对于将多个Word文档压缩成一个Zip文件的需求,Java可以使用ZipOutputStream类来实现,ZipOutputStream类能够很方便地对多个文件进行压缩处理。以下是大致的实现步骤: 1. 使用POI库创建并编辑Word文档,将数据写入到文档中。 2. 每次写完一条数据后就将该文档保存到本地,可以使用doc或docx格式,以便后续进行压缩。 3. 将所有生成的Word文档文件名存储到一个List中。 4. 使用ZipOutputStream类创建一个Zip压缩文件,即ZipOutputStream将数据写入到.zip的文件中。 5. 遍历保存Word文档文件名的List,并逐个将文件压缩到ZipOutputStream中。 6. 关闭ZipOutputStream和每个Word文档的输入流。 代码示例: ```java // 创建一个Zip文件输出流 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("output.zip")); // 设置压缩方法 zipOut.setMethod(ZipOutputStream.DEFLATED); // 遍历Word文档文件名的List for (String fileName : fileNames) { // 将Word文档文件读入 FileInputStream fis = new FileInputStream(new File(fileName)); // 将读入的Word文档压缩到ZipOutputStream中 zipOut.putNextEntry(new ZipEntry(new File(fileName).getName())); // 读入数据到缓冲区 byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { zipOut.write(buffer, 0, len); } // 关闭输入流 fis.close(); // 关闭该Entry zipOut.closeEntry(); } // 关闭ZipOutputStream zipOut.close(); ``` 这样,所有的Word文档都被压缩成了一个Zip文件,每个Word文档都形成了一个单独的Entry,并可以使用任何Zip文件处理工具进行解压。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值