位置: IT常识 - 正文

EasyExcel解析动态表头及导出(easyexcel解析csv)

编辑:rootadmin
EasyExcel解析动态表头及导出 前言

推荐整理分享EasyExcel解析动态表头及导出(easyexcel解析csv),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:excel 解析,easyexcel动态列设置值,easyexcel解析动态表头,easyexcel解析动态表头,easyexcel动态生成模板详解,easyexcel解析csv,easyexcel解析动态表头,easyexcel动态生成模板详解,内容如对您有帮助,希望把文章链接给更多的朋友!

excel文件导入及导出,是日常开发中经常遇到的需求。本次笔者以EasyExcel为例,针对在项目中遇到的动态表头解析及导出的场景,详细介绍具体的代码实现过程。

参考地址

https://github.com/alibaba/easyexcel

前端下载 const download = () => { axios({ method: 'GET', url: config.http.baseUrl + '/templateDownload', responseType: 'blob', }) .then(function (res) { const content = res.data const blob = new Blob([content], { type: "application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }) const downloadElement = document.createElement("a"); const href = window.URL.createObjectURL(blob); downloadElement.href = href; downloadElement.download = decodeURI(res.headers['filename']); document.body.appendChild(downloadElement); downloadElement.click(); document.body.removeChild(downloadElement); // 下载完成移除元素 window.URL.revokeObjectURL(href); // 释放掉blob对象 }) }模板下载

excel文件导入功能,常常需要进行模板下载,在springboot项目中,程序是以jar包的形式运行的,所以有很多小伙伴常常

遇到在本地开发中能够实现下载功能,但部署到服务器的时候,找不到模板文件的问题。

@Overridepublic void templateDownload(HttpServletResponse response, HttpServletRequest request) { //获取要下载的模板名称 String fileName = "批量导入模板.xlsx"; //获取文件下载路径 String filePath = "/template/template.xlsx"; TemplateDownloadUtil.download(response, request, fileName, filePath);}import lombok.extern.slf4j.Slf4j;import org.springframework.core.io.ClassPathResource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.InputStream;import java.io.OutputStream;import java.net.URLEncoder;/** * 模板文件下载工具类 * @author * @date 2021/05/20 9:20 */@Slf4jpublic class TemplateDownloadUtil { public static void download(HttpServletResponse response, HttpServletRequest request,String fileName,String filePath){ try { response.setContentType("application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8")); response.setHeader("filename", URLEncoder.encode(fileName, "UTF-8")); response.setHeader("Access-Control-Expose-Headers", "filename,Content-Disposition"); //获取文件的路径,此方式本地开发可以运行,服务器无法获取文件// String filePath = getClass().getResource("/template/template.xlsx").getPath();// FileInputStream input = new FileInputStream(filePath); //在服务器中能够读取到模板文件 ClassPathResource resource = new ClassPathResource(filePath); InputStream input = resource.getInputStream(); OutputStream out = response.getOutputStream(); byte[] b = new byte[2048]; int len; while ((len = input.read(b)) != -1) { out.write(b, 0, len); } //修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击"是"// response.setHeader("Content-Length", String.valueOf(input.getChannel().size())); input.close(); } catch (Exception e) { log.error("下载模板失败 :", e); } }}EasyExcel动态表头解析

EasyExcel简单的读文件,官网中已经有详细的说明,本文不再赘述,详细操作参见

EasyExcel解析动态表头及导出(easyexcel解析csv)

本文主要针对笔者遇到的复杂表头及动态表头进行讲解。

模板示例

解析import com.alibaba.excel.context.AnalysisContext;import com.alibaba.excel.event.AnalysisEventListener;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import lombok.Data;import lombok.extern.slf4j.Slf4j;import java.time.LocalDateTime;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.stream.Collectors;/** * 发薪单上传excel读取类 * * @author yupf * @description Listener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 */@Slf4j@Datapublic class BatchReadListener extends AnalysisEventListener<Map<Integer, String>> { /** * 每隔500条存储数据库,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 500; //Excel数据缓存结构 private List<Map<Integer, Map<Integer, String>>> list = new ArrayList<>(); //Excel表头(列名)数据缓存结构 private Map<Integer, String> headTitleMap = new HashMap<>(); /** * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。 */ private DbFileBatchService dbFileBatchService; private DbFileContentService dbFileContentService; private FileBatch fileBatch; private int total = 0; /** * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来 */ public BatchReadListener(DbFileBatchService dbFileBatchService, DbFileContentService dbFileContentService, FileBatch fileBatch) { this.dbFileBatchService = dbFileBatchService; this.dbFileContentService = dbFileContentService; this.fileBatch = fileBatch; } /** * 这个每一条数据解析都会来调用 * * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()} * @param context */ @Override public void invoke(Map<Integer, String> data, AnalysisContext context) { log.info("解析到一条数据:{}", JSON.toJSONString(data)); total++; Map<Integer, Map<Integer, String>> map = new HashMap<>(); map.put(context.readRowHolder().getRowIndex(), data); list.add(map); // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM if (list.size() >= BATCH_COUNT) { saveData(); // 存储完成清理 list list.clear(); } } /** * 所有数据解析完成了 都会来调用 * * @param context */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 saveData(); log.info("所有数据解析完成!"); } /** * 解析表头数据 **/ @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { log.info("表头数据:{}", JSONObject.toJSONString(headMap)); headTitleMap = headMap; } /** * 加上存储数据库 */ private void saveData() { log.info("{}条数据,开始存储数据库!", list.size()); FileContent fileContent = null; List<FileContent> fileContentList = list.stream().flatMap( integerMap -> integerMap.entrySet().stream().map(entrySet -> { //entrySet.getKey()获取的是内容的RowIndex,实际的行数需要根据表头数进行处理 Integer rowIndex = entrySet.getKey(); Map<Integer, String> value = entrySet.getValue(); log.info(JSONObject.toJSONString(value)); fileContent = new FileContent(); fileContent.setBatchId(fileBatch.getId()); fileContent.setBatchNo(fileBatch.getBatchNo()); //固定字段入库 fileContent.setName(value.get(0) != null ? value.get(0).trim() : ""); fileContent.setCertNo(value.get(1) != null ? value.get(1).trim() : ""); fileContent.setRealAmount(value.get(2) != null ? value.get(2).trim() : ""); //所有动态表头数据转为JSON串入库 fileContent.setFieldsValue(JSONObject.toJSONString(value)); //取实际的内容rowIndex fileContent.setRowNum(rowIndex + 1); fileContent.setCreateTime(LocalDateTime.now()); return xcSalaryFileContent; } )).collect(Collectors.toList()); log.info(JSONObject.toJSONString(fileContentList)); dbFileContentService.saveBatch(fileContentList); log.info("存储数据库成功!"); }} BatchReadListener listener = new BatchReadListener(dbFileBatchService, dbFileContentService, fileBatch); try { //注:headRowNumber默认为1,现赋值为2,即从第三行开始读取内容 EasyExcel.read(fileInputStream, listener).headRowNumber(2).sheet().doRead(); } catch (Exception e) { log.info("EasyExcel解析文件失败,{}", e); throw new CustomException("文件解析失败,请重新上传"); } //获取表头信息进行处理 Map<Integer, String> headTitleMap = listener.getHeadTitleMap(); //获取动态表头信息 List<String> headList = headTitleMap.keySet().stream().map(key -> { String head = headTitleMap.get(key); log.info(head); return head == null ? "" : head.replace("*", ""); }).collect(Collectors.toList()); //可以对表头进行入库保存,方便后续导出

综上,动态表头即可完成解析。

EasyExcel动态表头导出导出示例

获取动态头 private List<List<String>> getFileHeadList( FileBatch fileBatch) { String head = fileBatch.getFileHead(); List<String> headList = Arrays.asList(head.split(",")); List<List<String>> fileHead = headList.stream().map(item -> concatHead(Lists.newArrayList(item))).collect(Collectors.toList()); fileHead.add(concatHead(Lists.newArrayList("备注"))); return fileHead; } /** * 填写须知 * @param headContent * @return */private List<String> concatHead(List<String> headContent) { String remake = "填写须知: \n" + "1.系统自动识别Excel表格,表头必须含有“企业账户号”、“企业账户名”、“实发金额”;\n" + "2.带 “*” 为必填字段,填写后才能上传成功;\n" + "3.若需上传其他表头,可自行在“实发金额”后添加表头,表头最多可添加20个,表头名称请控制在8个字以内;\n" + "4.填写的表头内容不可超过30个字;\n" + "5.实发金额支持填写到2位小数;\n" + "6.每次导入数据不超过5000条。\n" + "\n" + "注:请勿删除填写须知,删除后将导致文件上传失败\n" + "\n" + "表头示例:"; headContent.add(0, remake); return headContent; }获取数据 List<FileContent> fileContentList = dbFileContentService.list( Wrappers.<FileContent>lambdaQuery() .eq(FileContent::getBatchId, fileBatch.getId()) .orderByAsc(FileContent::getRowNum) ); List<List<Object>> contentList = fileContentList.stream().map(fileContent -> { List<Object> rowList = new ArrayList<>(); String fieldsValue = fileContent.getFieldsValue(); JSONObject contentObj = JSONObject.parseObject(fieldsValue); for (int columnIndex = 0 , length = headList.size(); columnIndex < length; columnIndex++) { Object content = contentObj.get(columnIndex); rowList.add(content == null ? "" : content); } rowList.add(fileContent.getCheckMessage()); return rowList; }).collect(Collectors.toList());单元格格式设置import com.alibaba.excel.metadata.data.DataFormatData;import com.alibaba.excel.metadata.data.WriteCellData;import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;import com.alibaba.excel.write.metadata.style.WriteCellStyle;import com.alibaba.excel.write.metadata.style.WriteFont;import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;import org.apache.poi.ss.usermodel.BorderStyle;import org.apache.poi.ss.usermodel.HorizontalAlignment;import org.apache.poi.ss.usermodel.IndexedColors;import java.util.List;/** * 设置表头和填充内容的样式 */public class CellStyleStrategy extends HorizontalCellStyleStrategy { private final WriteCellStyle headWriteCellStyle; private final WriteCellStyle contentWriteCellStyle; /** * 操作列 */ private final List<Integer> columnIndexes; public CellStyleStrategy(List<Integer> columnIndexes,WriteCellStyle headWriteCellStyle, WriteCellStyle contentWriteCellStyle) { this.columnIndexes = columnIndexes; this.headWriteCellStyle = headWriteCellStyle; this.contentWriteCellStyle = contentWriteCellStyle; } //设置头样式 @Override protected void setHeadCellStyle( CellWriteHandlerContext context) { // 获取字体实例 WriteFont headWriteFont = new WriteFont(); headWriteFont.setFontName("宋体"); //表头不同处理 if (columnIndexes.get(0).equals(context.getRowIndex())) { headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT); headWriteFont.setFontHeightInPoints((short) 12); headWriteFont.setBold(false); headWriteFont.setFontName("宋体"); }else{ headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); headWriteFont.setFontHeightInPoints((short) 11); headWriteFont.setBold(false); headWriteFont.setFontName("微软雅黑"); } headWriteCellStyle.setWriteFont(headWriteFont); DataFormatData dataFormatData = new DataFormatData(); dataFormatData.setIndex((short)49); headWriteCellStyle.setDataFormatData(dataFormatData); if (stopProcessing(context)) { return; } WriteCellData<?> cellData = context.getFirstCellData(); WriteCellStyle.merge(headWriteCellStyle, cellData.getOrCreateStyle()); } //设置填充数据样式 @Override protected void setContentCellStyle(CellWriteHandlerContext context) { WriteFont contentWriteFont = new WriteFont(); contentWriteFont.setFontName("宋体"); contentWriteFont.setFontHeightInPoints((short) 11); //设置数据填充后的实线边框 contentWriteCellStyle.setWriteFont(contentWriteFont); contentWriteCellStyle.setBorderLeft(BorderStyle.THIN); contentWriteCellStyle.setBorderTop(BorderStyle.THIN); contentWriteCellStyle.setBorderRight(BorderStyle.THIN); contentWriteCellStyle.setBorderBottom(BorderStyle.THIN); DataFormatData dataFormatData = new DataFormatData(); dataFormatData.setIndex((short)49); contentWriteCellStyle.setDataFormatData(dataFormatData); contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); WriteCellData<?> cellData = context.getFirstCellData(); WriteCellStyle.merge(contentWriteCellStyle, cellData.getOrCreateStyle()); }}行高设置import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy;import org.apache.poi.ss.usermodel.Row;/** * 设置表头的自动调整行高策略 */public class CellRowHeightStyleStrategy extends AbstractRowHeightStyleStrategy { @Override protected void setHeadColumnHeight(Row row, int relativeRowIndex) { //设置主标题行高为17.7 if(relativeRowIndex == 0){ //如果excel需要显示行高为15,那这里就要设置为15*20=300 row.setHeight((short) 3240); } } @Override protected void setContentColumnHeight(Row row, int relativeRowIndex) { }}列宽度自适应

如果是简单表头,可以使用EasyExcel中的LongestMatchColumnWidthStyleStrategy()来实现。

EasyExcel.write(fileName, LongestMatchColumnWidthData.class) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet("模板").doWrite(dataLong());

如果是复杂表头,就需要自己来实现,代码如下:

import com.alibaba.excel.enums.CellDataTypeEnum;import com.alibaba.excel.metadata.Head;import com.alibaba.excel.metadata.data.CellData;import com.alibaba.excel.metadata.data.WriteCellData;import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;import lombok.extern.slf4j.Slf4j;import org.apache.commons.collections.CollectionUtils;import org.apache.poi.ss.usermodel.Cell;import java.util.HashMap;import java.util.List;import java.util.Map;/** * @author yupf * @description * @date 2022/9/7 18:48 */@Slf4jpublic class CellWidthStyleStrategy extends AbstractColumnWidthStyleStrategy { private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>(); @Override protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo()); if (maxColumnWidthMap == null) { maxColumnWidthMap = new HashMap<>(); CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap); } if (isHead) { if(relativeRowIndex.intValue() == 1){ Integer length = cell.getStringCellValue().getBytes().length; Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex()); if (maxColumnWidth == null || length > maxColumnWidth) { maxColumnWidthMap.put(cell.getColumnIndex(), length); writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), length * 300); } } }else{ Integer columnWidth = this.dataLength(cellDataList, cell, isHead); if (columnWidth >= 0) { if (columnWidth > 255) { columnWidth = 255; } Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex()); if (maxColumnWidth == null || columnWidth > maxColumnWidth) { maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth); writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256); } } } } private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) { if (isHead) { return cell.getStringCellValue().getBytes().length; } else { CellData cellData = cellDataList.get(0); CellDataTypeEnum type = cellData.getType(); if (type == null) { return -1; } else { switch (type) { case STRING: return cellData.getStringValue().getBytes().length; case BOOLEAN: return cellData.getBooleanValue().toString().getBytes().length; case NUMBER: return cellData.getNumberValue().toString().getBytes().length; default: return -1; } } } }}写入文件EasyExcel.write(response.getOutputStream()) .head(head) .registerWriteHandler(new CellRowHeightStyleStrategy()) //设置行高的策略 .registerWriteHandler(new CellStyleStrategy(Arrays.asList(0,1),new WriteCellStyle(), new WriteCellStyle())) .registerWriteHandler(new CellWidthStyleStrategy()) .sheet(sheetName) .doWrite(list);总结

以上便是EasyExcel解析动态表头及导出的整个过程。

在使用过程中,笔者的感受是,上手难度很低,很适合新手去做简单的表格解析,当然,如果你的需求有复杂的格式,EasyExcel也提供了api,能够很好的满足需要。

本文链接地址:https://www.jiuchutong.com/zhishi/284034.html 转载请保留说明!

上一篇:显卡是4G的1050TI好还是3G的1060好(1050ti 4g显卡)

下一篇:windows7安装node14版本及以上(windows7安装nodejs14)

  • 闲鱼有规定几天内必须发货吗(闲鱼有规定几天内必须发货吗?没发货会怎样呢?)

    闲鱼有规定几天内必须发货吗(闲鱼有规定几天内必须发货吗?没发货会怎样呢?)

  • 小天才电话卡盖怎么抠出来(小天才电话卡盖怎么抠出来?视屏)

    小天才电话卡盖怎么抠出来(小天才电话卡盖怎么抠出来?视屏)

  • 小米悬浮窗小屏怎么开(小米悬浮窗小屏怎么调位置)

    小米悬浮窗小屏怎么开(小米悬浮窗小屏怎么调位置)

  • 小天才z6拍立拍怎么开启(小天才z7拍立拍)

    小天才z6拍立拍怎么开启(小天才z7拍立拍)

  • 华为荣耀悬浮窗口怎么打开(华为荣耀悬浮窗怎么用)

    华为荣耀悬浮窗口怎么打开(华为荣耀悬浮窗怎么用)

  • 美团众包拒单多久恢复(美团众包拒单多少封号)

    美团众包拒单多久恢复(美团众包拒单多少封号)

  • 腾讯会议中途退出会影响时长吗(腾讯会议中途退出录屏还在吗)

    腾讯会议中途退出会影响时长吗(腾讯会议中途退出录屏还在吗)

  • 腾讯视频怎么快速加倍播放(腾讯视频怎么快速登录别人的会员)

    腾讯视频怎么快速加倍播放(腾讯视频怎么快速登录别人的会员)

  • nova4长多少厘米(华为nova4长多少厘米)

    nova4长多少厘米(华为nova4长多少厘米)

  • 网络协议三要素是什么(网络协议三要素中,规定了用户数据格式的是( ))

    网络协议三要素是什么(网络协议三要素中,规定了用户数据格式的是( ))

  • 换货成功还能退货吗(换货以后可以再退嘛)

    换货成功还能退货吗(换货以后可以再退嘛)

  • ipad7,5是什么型号(ipad7.2是什么)

    ipad7,5是什么型号(ipad7.2是什么)

  • 手机掉地上黑屏了怎么办(手机掉地上黑屏了但是有声音)

    手机掉地上黑屏了怎么办(手机掉地上黑屏了但是有声音)

  • iphone11promax充电需要多长时间(iphone11promax充电头多少w)

    iphone11promax充电需要多长时间(iphone11promax充电头多少w)

  • 华为手表gt2能打电话吗(华为手表gt2能打电话微信吗)

    华为手表gt2能打电话吗(华为手表gt2能打电话微信吗)

  • 自己发的抖音如何删掉(自己发的抖音如何保存到相册)

    自己发的抖音如何删掉(自己发的抖音如何保存到相册)

  • 华为nova5pro卡槽怎么取出(华为nova5pro卡槽弹不出来)

    华为nova5pro卡槽怎么取出(华为nova5pro卡槽弹不出来)

  • 连续文件选取可以使用什么键(选择连续文件不连续文件全选的方法)

    连续文件选取可以使用什么键(选择连续文件不连续文件全选的方法)

  • 企业上云的弊端(企业上云的缺点)

    企业上云的弊端(企业上云的缺点)

  • 华为nova4容易发热吗(华为nova4很容易发烫)

    华为nova4容易发热吗(华为nova4很容易发烫)

  • 怎么剪去视频多余部分(剪辑视频怎么把多余剪掉)

    怎么剪去视频多余部分(剪辑视频怎么把多余剪掉)

  • 抖音怎么退出粉丝团(抖音怎么退出粉丝团灯牌)

    抖音怎么退出粉丝团(抖音怎么退出粉丝团灯牌)

  • 爱奇艺号视频审核标准是什么(爱奇艺视频审核员工资)

    爱奇艺号视频审核标准是什么(爱奇艺视频审核员工资)

  • js查找数组中符合条件的元素(js查找数组所有符合条件数据)

    js查找数组中符合条件的元素(js查找数组所有符合条件数据)

  • 什么情况下个人资产会被冻结
  • 企业所得税如何合理避税?
  • 结转所得税的会计分录是什么
  • 印花税应纳税额计算方法
  • 公司注销了账本还需保留吗
  • 合作社专项基金年底怎结转
  • 增值税延期滞纳金是多少
  • 办公费专票怎么做账
  • 一般纳税人和小规模纳税人的区别
  • 公司取现需要带什么东西
  • 借款利息收入所得税
  • 个人房产税延期怎么办理
  • 机动车发票申请流程
  • 五证合一流程
  • 公司取现备用金违法吗
  • 进口报关手续费
  • 企业采购材料没有发票是要交企业所得税吗
  • 私车公用保险费用公司承担吗
  • 管理人员工资计入管理费用吗
  • 逾期包装物押金消费税会计分录
  • 拆迁安置房建设流程
  • 增值税发票单位可以不填吗
  • 三八妇女节要求小班幼儿到校怎么分享
  • 关于开票时纳税的规定
  • 企业在年度中间终止经营活动的,应当
  • 旅游服务机票款普通发票可以抵扣吗
  • 外购产品用于赠送帐务处理
  • 集体福利的增值税怎么算
  • 个体户免税额度超出了
  • 办公软件无形资产的确认条件有哪些
  • 税务更正申报需要哪些资料
  • 斐讯p.to路由器管理员密码
  • 商贸公司不开发票还要上税吗
  • 开机提示lsass应用程序出错
  • 苹果桌面小工具怎么设置
  • 营改增后不动产租赁费的税率是多少
  • windows 10月更新
  • windows 11 正式版实际使用体验如何?
  • PHP:oci_client_version()的用法_Oracle函数
  • 偿还债券本金和利息
  • 舍夫沙万的蓝色是什么意思
  • php的exec
  • 借应付职工薪酬贷其他应收款
  • 结存材料实际成本分录
  • vue 提示
  • echarts怎么样
  • 提供有形动产租赁服务的增值税税率为
  • Squarespace 和 WordPress 的区别
  • 交通银行手机银行网页版
  • 固定资产清理销售的收入
  • 怎么算长期合同
  • 金蝶新建账套如何录入固定资产账套
  • 税控盘的进项税在哪里申报
  • 销售货款未收到会计分录
  • 商家说垫付运费
  • 已认证未记账
  • 税盘的服务费
  • 车辆报废如何进行
  • 企业向福利院捐款属于 公共关系
  • 固定资产更新改造当月是否计提折旧
  • 商标 入账
  • 投资收益的主要来源有
  • 收入纳税明细里的收入和实际不符
  • 应交税费进项税额转出
  • 企业筹建期间发生的费用应计入什么账户
  • 酒店会计科目表
  • mysql5.5安装配置教程
  • mysql创建用户密码命令
  • win8系统无法连接到网络
  • windows怎么安装
  • win7怎么查看
  • mac如何搜索应用
  • win7共享打印机提示0x000709
  • win10输入法怎么添加美式键盘
  • js用什么编写
  • javascript ie
  • nodejs实现登录功能
  • 开发板io口在哪
  • 个体户注销税盘需要公章吗
  • 北京中关村海淀医院属于北京几环?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设