easyexcel 列头合并_Easyexcel使用文档及动态列的实现

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。

我建议大家使用1.1.2-beta4版本,也就是官方给的最新版,maven仓库查到的最新版比这个版本略低,最显著的区别就是excel中数字的输出,最新版本到处excel会将数字专为数字格式,而maven库给出的最新版则会输出成文本格式。其他变化需要各位自己去发现。

官方文档地址

https://github.com/alibaba/easyexcel

添加依赖

com.alibaba

easyexcel

1.1.2-beta4

使用方法

1.表头带注解方法

这种方法首先需要一个继承BaseRowModel的模型,在Hap框架dto的角色就相当于这个模型,示例如下

package ect.report.dto;

import com.alibaba.excel.annotation.ExcelProperty;

import com.alibaba.excel.metadata.BaseRowModel;

import java.math.BigDecimal;

import java.util.Date;

/**

* @ClassName: TraBilDetail

* @Description: TODO

* @Date: 2019-03-29 09:52

* @Version 1.0

*/

public class TraBilDetail extends BaseRowModel {

//开票申请号

@ExcelProperty(value = {"开票申请号"}, index = 0)

private String applyNum;

//批次号

@ExcelProperty(value = {"批次号"}, index = 1)

private String batchNum;

//制单部门

@ExcelProperty(value = {"制单部门"}, index = 2)

private String name;

//客户名称

@ExcelProperty(value = {"客户名称"}, index = 3)

private String custName;

//业务类型

@ExcelProperty(value = {"业务类型"}, index = 4)

private String busiType;

//批次开票金额

@ExcelProperty(value = {"批次开票金额"}, index = 5)

private BigDecimal sumPrice;

//批次开票重量

@ExcelProperty(value = {"批次开票重量"}, index = 6)

private BigDecimal invoWeight;

//批次财务入总金额

@ExcelProperty(value = {"批次财务入总金额"}, index = 7)

private BigDecimal findInAmoundSum;

//邮寄信息

@ExcelProperty(value = {"邮寄信息"}, index = 8)

private String mailAddress;

private String contactName;

private String telephone;

/*=========================== 查询字段================================*/

private Long comId;

private Date applyDateStart;

private Date applyDateEnd;

/*=====================================*/

get和set方法省略

/*=====================================*/

}

然后mapper.java,Service.java,~ServiceImpl.java都要去掉继承系统框架的base接口。mapper层写好查询出需要展示的数据,dto的注解中字段对应的显示。上述例子写的是单层头结构,如果想要写成双层或者多层,可以想一下示例一样添加。

package ect.report.dto;

import com.alibaba.excel.annotation.ExcelProperty;

import com.alibaba.excel.metadata.BaseRowModel;

import java.math.BigDecimal;

/**

* @ClassName: BatchSupply

* @Description: TODO

* @Date: 2019-04-02 09:00

* @Version 1.0

*/

public class BatchSupply extends BaseRowModel {

//公司名称

@ExcelProperty(value = {"在库货源","姓名"} ,index = 0)

private String comName;

//仓库名称

@ExcelProperty(value = {"在库货源","仓库名称"} ,index = 1)

private String subinvName;

//产地

@ExcelProperty(value = {"在库货源","产地"} ,index = 2)

private String terrName;

//等级

@ExcelProperty(value = {"在库货源","等级"} ,index = 3)

private String ctLevel;

//长度

@ExcelProperty(value = {"在库货源","长度"} ,index = 4)

private String length;

//长度均值

@ExcelProperty(value = {"在库货源","长度均值"} ,index = 5)

private String lengthMean;

//马值

@ExcelProperty(value = {"在库货源","马值"} ,index = 6)

private String micron;

//马值均值

@ExcelProperty(value = {"在库货源","马值均值"} ,index = 7)

private String micronMean;

//强力

@ExcelProperty(value = {"在库货源","强力"} ,index = 8)

private String strong;

//强力均值

@ExcelProperty(value = {"在库货源","强力均值"} ,index = 9)

private String strongMean;

//提单号

@ExcelProperty(value = {"在库货源","提单号"} ,index = 10)

private String blNum;

//入库单号

@ExcelProperty(value = {"在库货源","入库单号"} ,index = 11)

private String entryNum;

//箱号

@ExcelProperty(value = {"在库货源","箱号"} ,index = 12)

private String batchNum;

//入库件数

@ExcelProperty(value = {"在库货源","入库件数"} ,index = 13)

private BigDecimal batchQty;

//销售合同号

@ExcelProperty(value = {"在库货源","销售合同号"} ,index = 14)

private String conNum;

//出库单号

@ExcelProperty(value = {"在库货源","出库单号"} ,index = 15)

private String outNum;

//出库件数

@ExcelProperty(value = {"在库货源","出库件数"} ,index = 16)

private BigDecimal outBatchQty;

//在库箱数

@ExcelProperty(value = {"在库货源","在库箱数"} ,index = 17)

private String outStatus;

//在库件数

@ExcelProperty(value = {"在库货源","在库件数"} ,index = 18)

private BigDecimal wareQty;

//采购合同单价

@ExcelProperty(value = {"在库货源","采购合同单价"} ,index = 19)

private BigDecimal conPrice;

//财务入库成本

@ExcelProperty(value = {"在库货源","财务入库成本"} ,index = 20)

private BigDecimal finaPrice;

//初始财务入库成本(USD)

@ExcelProperty(value = {"在库货源","财务入库成本"} ,index = 21)

private BigDecimal firstUsdPrice;

//初始财务入库成本(CNY)

@ExcelProperty(value = {"在库货源","初始财务入库成本"} ,index = 22)

private BigDecimal firstRmbPrice;

private String lengthMax;

private String lengthMin;

private String micronMax;

private String micronMin;

private String strongMax;

private String strongMin;

private String terrCode;

private String comCode;

private String subinvId;

private String isBatchFlag;

private Long specId;

/*=====================================*/

get和set方法省略

/*=====================================*/

}

然后在Service层组装业务逻辑并且输出excel文档。

package ect.report.service.impl;

import com.alibaba.excel.ExcelWriter;

import com.alibaba.excel.metadata.Sheet;

import com.alibaba.excel.support.ExcelTypeEnum;

import ect.inv.util.StringUtils;

import ect.report.dto.TraBilDetail;

import ect.report.mapper.TraBilDetailMapper;

import ect.report.utils.EasyEacelUtils;

import jodd.util.StringUtil;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import ect.report.service.ITraBilDetailService;

import org.springframework.transaction.annotation.Transactional;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.List;

/**

* @ClassName: TraBilDetailServiceImpl

* @Description: TODO

* @Date: 2019-03-29 09:53

* @Version 1.0

*/

@Service

@Transactional(rollbackFor = Exception.class)

public class TraBilDetailServiceImpl implements ITraBilDetailService{

@Autowired

private TraBilDetailMapper traBilDetailMapper;

@Override

public void export(HttpServletRequest request, TraBilDetail traBilDetail, HttpServletResponse httpServletResponse) throws IOException {

String fileName="内贸开票明细表";

//组装输出流

ServletOutputStream outputStream = EasyEacelUtils.createOutputStream(request, httpServletResponse, fileName);

try {

ExcelWriter writer = new ExcelWriter(outputStream, ExcelTypeEnum.XLSX);

Sheet sheet1 = new Sheet(1, 0, TraBilDetail.class);

//自适应宽度

sheet1.setAutoWidth(Boolean.TRUE);

//添加数据

writer.write(traBilDetailMapper.selectTraBilDetail(traBilDetail), sheet1);

writer.finish();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

outputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

这样一个非常简单的excel导出就完成了,这种方法适合于常规的excle导出。如果sql查询的数据还不能瞒住需求,需要Java中继续添加业务逻辑的话,可以继续组装成一个返回List的方法。示例如下

package ect.report.service.impl;

import com.alibaba.excel.ExcelWriter;

import com.alibaba.excel.metadata.Sheet;

import com.alibaba.excel.support.ExcelTypeEnum;

import ect.co.mapper.ConContractMapper;

import ect.fs.mapper.FsPayAppExpMapper;

import ect.fs.mapper.FsPayAppGooMapper;

import ect.inv.mapper.WarehousingMapper;

import ect.report.dto.ConSheet;

import ect.report.mapper.ConSheetMapper;

import ect.report.service.IConSheetService;

import ect.report.utils.EasyEacelUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.math.BigDecimal;

import java.util.HashSet;

import java.util.LinkedList;

import java.util.List;

@Service

@Transactional(rollbackFor = Exception.class)

public class ConSheetServiceImpl implements IConSheetService{

@Autowired

private ConSheetMapper sheetMapper;

@Autowired

private FsPayAppGooMapper fsPayAppGooMapper;

@Autowired

private FsPayAppExpMapper fsPayAppExpMapper;

@Autowired

private ConContractMapper conContractMapper;

@Autowired

private WarehousingMapper warehousingMapper;

private static final String REMORK_FIX = "转仓单重量:";

@Override

public void export(HttpServletRequest request, ConSheet conSheet, HttpServletResponse httpServletResponse) throws IOException {

String fileName="联营业务表";

List dataList = loadReportData(conSheet);

ServletOutputStream outputStream = EasyEacelUtils.createOutputStream(request, httpServletResponse, fileName);

try {

ExcelWriter writer = new ExcelWriter(outputStream, ExcelTypeEnum.XLSX);

Sheet sheet1 = new Sheet(1, 0, ConSheet.class);

//Table table = new Table(2);

sheet1.setAutoWidth(Boolean.TRUE);

writer.write(dataList, sheet1);

writer.finish();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

outputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 将sql中查询出的数据添加合计逻辑

* @param conSheet

* @return

*/

private List loadReportData(ConSheet conSheet) {

//汇总信息

ConSheet conSheetSum = new ConSheet();

BigDecimal sumEntryWeight = BigDecimal.ZERO;

BigDecimal sumAppAmt = BigDecimal.ZERO;

BigDecimal sumOutBatchWeight = BigDecimal.ZERO;

BigDecimal sumNoOutBatchWeight = BigDecimal.ZERO;

BigDecimal sumtBatchWeight = BigDecimal.ZERO;

BigDecimal sumInvenWeight = BigDecimal.ZERO;

BigDecimal sumEntryAmt = BigDecimal.ZERO;

BigDecimal sumSumExp = BigDecimal.ZERO;

BigDecimal sumInterest = BigDecimal.ZERO;

BigDecimal sumRiskDegree = BigDecimal.ZERO;

BigDecimal sumCheckAmt = BigDecimal.ZERO;

BigDecimal sumInvoWeight = BigDecimal.ZERO;

BigDecimal sumToBatchWeight = BigDecimal.ZERO;

List uniConExportList = sheetMapper.selectUniCon(conSheet);

for (ConSheet uniConExport : uniConExportList) {

Long conId = uniConExport.getConId();

// 查询 我司支付

BigDecimal amtSum = fsPayAppGooMapper.selectUniConAmtByConId(conId.floatValue());

uniConExport.setAppAmt(amtSum);

// 费用

BigDecimal sumExp = fsPayAppExpMapper.selectSumExpByConId(conId.floatValue());

uniConExport.setSumExp(sumExp);

// 未销数量

BigDecimal noOutBatchWeight = conContractMapper.selectQtyNotSoldByConId(conId.floatValue());

uniConExport.setNoOutBatchWeight(noOutBatchWeight);

// 求已销数量

BigDecimal outBatchWeight = conContractMapper.selectQtySoldByConId(conId.floatValue());

uniConExport.setOutBatchWeight(outBatchWeight);

// 风险度

BigDecimal invenWeight = uniConExport.getInvenWeight();

if (invenWeight != null && invenWeight.compareTo(BigDecimal.ZERO) != 0) {

// 我司支付

BigDecimal appAmt = uniConExport.getAppAmt();

//回笼资金

BigDecimal entryAmt = uniConExport.getEntryAmt();

// 费用

BigDecimal exp = uniConExport.getSumExp();

// 利息

BigDecimal interest = uniConExport.getInterest();

// 排除空

appAmt = appAmt == null ? BigDecimal.ZERO : appAmt;

entryAmt = entryAmt == null ? BigDecimal.ZERO : entryAmt;

exp = exp == null ? BigDecimal.ZERO : exp;

interest = interest == null ? BigDecimal.ZERO : interest;

BigDecimal sum = appAmt.subtract(entryAmt).add(exp).add(interest);

uniConExport.setRiskDegree(sum.divide(invenWeight, 2, BigDecimal.ROUND_HALF_UP));

}

// 备注

BigDecimal toBatchWeight = warehousingMapper.selectToBatchWeightByConId(conId.floatValue());

toBatchWeight = toBatchWeight == null ? BigDecimal.ZERO : toBatchWeight;

uniConExport.setRemark(REMORK_FIX + toBatchWeight.toString());

sumToBatchWeight = sumToBatchWeight.add(toBatchWeight);

sumEntryWeight = sumEntryWeight.add(uniConExport.getEntryWeight());

sumAppAmt = sumAppAmt.add(uniConExport.getAppAmt()==null?BigDecimal.ZERO:uniConExport.getAppAmt());

sumOutBatchWeight = sumOutBatchWeight.add(uniConExport.getOutBatchWeight()==null?BigDecimal.ZERO:uniConExport.getOutBatchWeight());

sumNoOutBatchWeight = sumNoOutBatchWeight.add(uniConExport.getNoOutBatchWeight()==null?BigDecimal.ZERO:uniConExport.getNoOutBatchWeight());

sumtBatchWeight = sumtBatchWeight.add(uniConExport.getBatchWeight());

sumInvenWeight = sumInvenWeight.add(uniConExport.getInvenWeight());

sumEntryAmt = sumEntryAmt.add(uniConExport.getEntryAmt());

sumSumExp = sumSumExp.add(uniConExport.getSumExp() == null ? BigDecimal.ZERO:uniConExport.getSumExp());

sumInterest = sumInterest.add(uniConExport.getInterest()==null?BigDecimal.ZERO:uniConExport.getInterest());

sumRiskDegree = sumRiskDegree.add(uniConExport.getRiskDegree()==null?BigDecimal.ZERO:uniConExport.getRiskDegree());

sumCheckAmt = sumCheckAmt.add(uniConExport.getCheckAmt()==null?BigDecimal.ZERO:uniConExport.getCheckAmt());

sumInvoWeight = sumInvoWeight.add(uniConExport.getInvoWeight());

}

List sheetList = groupByParty(uniConExportList);

//汇总信息

//conSheetSum.setEntryWeight(sheetList.stream().map(ConSheet::getEntryWeight).reduce(BigDecimal.ZERO, BigDecimal::add));

conSheetSum.setEntryWeight(sumEntryWeight);

conSheetSum.setAppAmt(sumAppAmt);

conSheetSum.setOutBatchWeight(sumOutBatchWeight);

conSheetSum.setNoOutBatchWeight(sumNoOutBatchWeight);

conSheetSum.setBatchWeight(sumtBatchWeight);

conSheetSum.setInvenWeight(sumInvenWeight);

conSheetSum.setEntryAmt(sumEntryAmt);

conSheetSum.setSumExp(sumSumExp);

conSheetSum.setInterest(sumInterest);

conSheetSum.setRiskDegree(sumRiskDegree);

conSheetSum.setCheckAmt(sumCheckAmt);

conSheetSum.setInvoWeight(sumInvoWeight);

conSheetSum.setRemark(REMORK_FIX +sumToBatchWeight);

conSheetSum.setPartyName("合计: ");

List conSheets = groupByParty(uniConExportList);

conSheets.add(conSheetSum);

return conSheets;

}

/**

* 根据部门进行分组

* @param uniConExportList

* @return

*/

private List groupByParty(List uniConExportList) {

LinkedList finalList = new LinkedList<>();

HashSet partySet = new HashSet<>();

// LinkedHashMap partyMap = new LinkedHashMap<>();

for(ConSheet uniConExport : uniConExportList){

if (partySet.add(uniConExport.getPartyName())) {

finalList.addLast(uniConExport);

}else {

int i =0;

boolean findFlag = false;

// 插入

for(ConSheet export : finalList ){

if(export.getPartyName().equals(uniConExport.getPartyName())){

findFlag = true;

}else if(findFlag){

break;

}

i++;

}

finalList.add(i,uniConExport);

}

}

return finalList;

}

}

官方示例dome

OutputStream out = new FileOutputStream("/Users/jipengfei/2007.xlsx");

ExcelWriter writer = EasyExcelFactory.getWriterWithTemp(inputStream,out,ExcelTypeEnum.XLSX,true);

//写第一个sheet, sheet1 数据全是List 无模型映射关系

Sheet sheet1 = new Sheet(1, 3);

sheet1.setSheetName("第一个sheet");

//设置列宽 设置每列的宽度

Map columnWidth = new HashMap();

columnWidth.put(0,10000);columnWidth.put(1,40000);columnWidth.put(2,10000);columnWidth.put(3,10000);

sheet1.setColumnWidthMap(columnWidth);

sheet1.setHead(createTestListStringHead());

//or 设置自适应宽度

//sheet1.setAutoWidth(Boolean.TRUE);

writer.write1(createTestListObject(), sheet1);

//写第二个sheet sheet2 模型上打有表头的注解,合并单元格

Sheet sheet2 = new Sheet(2, 3, JavaModel1.class, "第二个sheet", null);

sheet2.setTableStyle(createTableStyle());

writer.write(createTestListJavaMode(), sheet2);

//写第三个sheet包含多个table情况

Sheet sheet3 = new Sheet(3, 0);

sheet3.setSheetName("第三个sheet");

Table table1 = new Table(1);

table1.setHead(createTestListStringHead());

writer.write1(createTestListObject(), sheet3, table1);

//写sheet2 模型上打有表头的注解

Table table2 = new Table(2);

table2.setTableStyle(createTableStyle());

table2.setClazz(JavaModel1.class);

writer.write(createTestListJavaMode(), sheet3, table2);

//关闭资源

writer.finish();

out.close();

2.表头不带注解的方法

这种dto的写法跟上述的dto写法基本相同,就是去掉了注解。也可以不用dto,直接用List来代替dto的作用,其他都一样。表头带注解的方法不用自己写表头,不带注解的方法需要自己去组装表头,但是这种方法可以去调整表头字段的宽度。带注解的方法表头会自适应一个宽度出来。

Service方法示例如下

package ect.report.service.impl;

import ch.qos.logback.classic.Logger;

import com.alibaba.excel.ExcelWriter;

import com.alibaba.excel.metadata.Sheet;

import com.alibaba.excel.support.ExcelTypeEnum;

import com.hand.hap.core.IRequest;

import com.hand.hap.fnd.dto.Company;

import com.hand.hap.fnd.service.ICompanyService;

import ect.fs.dto.DailyRate;

import ect.fs.dto.FsComAttr;

import ect.fs.service.IDailyRateService;

import ect.fs.service.IFsComAttrService;

import ect.report.dto.InvomeCostDetail;

import ect.report.mapper.InvomeCostDetailMapper;

import ect.report.utils.EasyEacelUtils;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import ect.report.service.IInvomeCostDetailService;

import org.springframework.transaction.annotation.Transactional;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.math.BigDecimal;

import java.text.SimpleDateFormat;

import java.util.*;

/**

* @ClassName: InvomeCostDetailServiceImpl

* @Description:TODO

* @Date: 2019-03-26 16:14

* @Version 1.0

*/

@Service

@Transactional(rollbackFor = Exception.class)

public class InvomeCostDetailServiceImpl implements IInvomeCostDetailService {

private Logger logger = (Logger) LoggerFactory.getLogger(InvomeCostDetailServiceImpl.class);

@Autowired

private InvomeCostDetailMapper invomeCostDetailMapper;

@Autowired

private IDailyRateService dailyRateService;

@Autowired

private ICompanyService companyService;

@Autowired

private IFsComAttrService fsComAttrService;

//自营人民币销售合同

private final static String RMB_SO_CON_NUM = "SESRMBSAL";

//自营美元销售合同

private final static String USD_SO_CON_NUM = "SESUSBSAL";

public List loadReportData(IRequest requestContext, InvomeCostDetail detail) {

List companyList = companyService.selectComIdByRole(requestContext.getRoleId());

String currencyCode = null;

if (!companyList.isEmpty()) {

Long comId = companyList.get(0).getCompanyId();

if (comId != null) {

FsComAttr fsComAttr = fsComAttrService.selectByComId(comId.floatValue());

currencyCode = fsComAttr.getCurrencyCode();

}

}

final String comCurrencyCode = currencyCode;

DailyRate dailyRate = new DailyRate();

dailyRate.setConversionDate(detail.getPostDateEnd());

dailyRate.setFromCurrency(DailyRate.USD);

dailyRate.setToCurrency(DailyRate.CNY);

dailyRate.setConversionType(DailyRate.AVERAGE);

List dailyRates = dailyRateService.getRateByNew(dailyRate);

if (dailyRates.size()>0){

dailyRate=dailyRates.get(0);

}

final BigDecimal rate = dailyRate.getRate();

List incomeCostDetails = invomeCostDetailMapper.selectIncomDetail(detail);

incomeCostDetails.stream().forEach(incomeCostDetail -> {

if (RMB_SO_CON_NUM.equals(incomeCostDetail.getDetType())) {

//发票金额(不含税)

incomeCostDetail.setInvoApplyAmount(incomeCostDetail.getInvoApplyAmountRmb());

//incomeCostDetail.setPoCostAmount(incomeCostDetail.getPoCostAmountRmb());

}

if (USD_SO_CON_NUM.equals(incomeCostDetail.getDetType())) {

//发票金额(不含税)

incomeCostDetail.setInvoApplyAmount(incomeCostDetail.getInvoApplyAmountUsd());

// incomeCostDetail.setPoCostAmount(incomeCostDetail.getPoCostAmountUsd());

}

//出库金额(元)

if (incomeCostDetail.getInvoOutAmountCn() == null) {

incomeCostDetail.setInvoOutAmountCn(incomeCostDetail.getInvoOutAmount());

}

//出库汇率

if (incomeCostDetail.getInvoOutAmountCn() != null && incomeCostDetail.getInvoOutAmount() != null && incomeCostDetail.getInvoOutAmount().compareTo(BigDecimal.ZERO) != 0) {

incomeCostDetail.setRate(incomeCostDetail.getInvoOutAmountCn().divide(incomeCostDetail.getInvoOutAmount(), 4, BigDecimal.ROUND_HALF_UP));

}

BigDecimal finaRate = incomeCostDetail.getRate() == null ? BigDecimal.ONE : incomeCostDetail.getRate();

if ("进口".equals(incomeCostDetail.getBusiType())) {

incomeCostDetail.setInvoApplyAmountYuan(incomeCostDetail.getInvoApplyAmount());

} else if ("转口".equals(incomeCostDetail.getBusiType())) {

if (finaRate.compareTo(BigDecimal.ONE) == 0) {

finaRate = rate;

}

incomeCostDetail.setInvoApplyAmountYuan(incomeCostDetail.getInvoApplyAmount().multiply(finaRate));

}

//财务出库单价(人民币/吨) =出库金额(元)/财务出库重量

if (incomeCostDetail.getInvoOutAmountCn() != null && incomeCostDetail.getInvoOutWeight() != null && incomeCostDetail.getInvoOutWeight().compareTo(BigDecimal.ZERO) != 0) {

incomeCostDetail.setInvoOutPriceCn(incomeCostDetail.getInvoOutAmountCn().divide(incomeCostDetail.getInvoOutWeight(), 10, BigDecimal.ROUND_HALF_UP));

}

///财务出库单价

if (incomeCostDetail.getInvoOutAmount() != null && incomeCostDetail.getInvoOutWeight() != null && incomeCostDetail.getInvoOutWeight().compareTo(BigDecimal.ZERO) != 0) {

incomeCostDetail.setInvoOutPrice(incomeCostDetail.getInvoOutAmount().divide(incomeCostDetail.getInvoOutWeight(), 10, BigDecimal.ROUND_HALF_UP));

}

//对应初始采购成本金额

incomeCostDetail.setPoCostAmount(incomeCostDetail.getPoCostAmountUsd());

//对应初始采购成本金额(元)

incomeCostDetail.setPoCostAmountCn(incomeCostDetail.getPoCostAmountRmb());

//现货毛利(合并)原币 发票金额(不含税)-对应初始采购成本金额(原币)

if (incomeCostDetail.getInvoApplyAmount() != null && incomeCostDetail.getPoCostAmount() != null) {

if (DailyRate.USD.equals(incomeCostDetail.getInCurrencyCode()) && DailyRate.CNY.equals(incomeCostDetail.getOutCurrencyCode())) {

incomeCostDetail.setIncomeMeshAmount((incomeCostDetail.getInvoApplyAmount().divide(rate, 10, BigDecimal.ROUND_HALF_UP)).subtract(incomeCostDetail.getPoCostAmount()));

} else {

incomeCostDetail.setIncomeMeshAmount(incomeCostDetail.getInvoApplyAmount().subtract(incomeCostDetail.getPoCostAmount()));

}

}

//现货毛利(合并)人民币 发票金额(不含税)-对应初始采购成本金额(元)

BigDecimal applyAmount = BigDecimal.ZERO;

if ("进口".equals(incomeCostDetail.getBusiType())) {

applyAmount = incomeCostDetail.getInvoApplyAmount();

} else {

applyAmount = incomeCostDetail.getSumRmb();

}

if (applyAmount != null && incomeCostDetail.getPoCostAmountCn() != null) {

if (incomeCostDetail.getInvoApplyAmountYuan() != null && incomeCostDetail.getPoCostAmountCn() != null) {

incomeCostDetail.setIncomeMeshAmountCn(incomeCostDetail.getInvoApplyAmountYuan().subtract(incomeCostDetail.getPoCostAmountCn()));

}

}

if ("转口".equals(incomeCostDetail.getBusiType()) && ("中纺棉花(香港)有限公司".equals(incomeCostDetail.getComName()))) {

logger.info("2111");

}

//现货毛利(合并)人民币-财务口径 发票金额(不含税)-对应初始采购成本金额(元)

if ("进口".equals(incomeCostDetail.getBusiType()) || ("转口".equals(incomeCostDetail.getBusiType()) && (!"1445".equals(incomeCostDetail.getComCode())))) {

if (incomeCostDetail.getIncomeMeshAmountCn() != null) {

incomeCostDetail.setIncomeMeshAmountCnFina(incomeCostDetail.getIncomeMeshAmountCn());

}

} else if ("转口".equals(incomeCostDetail.getBusiType()) && ("1445".equals(incomeCostDetail.getComCode()))) {

if (incomeCostDetail.getIncomeMeshAmountCn() != null && rate!=null) {

incomeCostDetail.setIncomeMeshAmountCnFina(incomeCostDetail.getIncomeMeshAmount().multiply(rate));

}

}

//对应初始采购成本单价

if (incomeCostDetail.getPoCostAmount() != null && incomeCostDetail.getPoCostBatchWeight() != null) {

incomeCostDetail.setPoCostPricce(incomeCostDetail.getPoCostAmount().divide(incomeCostDetail.getPoCostBatchWeight(), 10, BigDecimal.ROUND_HALF_UP));

}

//对应初始采购成本单价(元/吨)

if (incomeCostDetail.getPoCostAmountCn() != null && incomeCostDetail.getPoCostBatchWeight() != null) {

incomeCostDetail.setPoCostPricceCn(incomeCostDetail.getPoCostAmountCn().divide(incomeCostDetail.getPoCostBatchWeight(), 10, BigDecimal.ROUND_HALF_UP));

}

//对应初始财务入库汇率

if (incomeCostDetail.getPoCostAmountCn() != null && incomeCostDetail.getPoCostAmount() != null && BigDecimal.ZERO.compareTo(incomeCostDetail.getPoCostAmount()) != 0) {

//对应初始采购成本金额/对应初始采购成本金额

incomeCostDetail.setPoRate(incomeCostDetail.getPoCostAmountCn().divide(incomeCostDetail.getPoCostAmount(), 10, BigDecimal.ROUND_HALF_UP));

}

//现货毛利(独立)原币 发票金额(不含税)-财务出库金额(原币)

if (incomeCostDetail.getInvoApplyAmount() != null && incomeCostDetail.getInvoOutAmount() != null) {

if (DailyRate.USD.equals(incomeCostDetail.getInCurrencyCode()) && DailyRate.CNY.equals(incomeCostDetail.getOutCurrencyCode())) {

incomeCostDetail.setIncomeSelfAmount(incomeCostDetail.getInvoApplyAmount().divide(rate, 10, BigDecimal.ROUND_HALF_UP).subtract(incomeCostDetail.getInvoOutAmount()));

} else {

incomeCostDetail.setIncomeSelfAmount(incomeCostDetail.getInvoApplyAmount().subtract(incomeCostDetail.getInvoOutAmount()));

}

}

//现货毛利(独立)人民币 发票金额(不含税)-财务出库金额(元)

if (applyAmount != null && incomeCostDetail.getInvoOutAmountCn() != null) {

if (DailyRate.USD.equals(comCurrencyCode)) {

incomeCostDetail.setIncomeSelfAmountCn(applyAmount.multiply(rate).subtract(incomeCostDetail.getInvoOutAmountCn()));

} else {

incomeCostDetail.setIncomeSelfAmountCn(applyAmount.subtract(incomeCostDetail.getInvoOutAmountCn()));

}

}

//现货毛利(独立)人民币-财务口径 发票金额(不含税)-财务出库金额(元)

if ("进口".equals(incomeCostDetail.getBusiType()) || ("转口".equals(incomeCostDetail.getBusiType()) && (!"1445".equals(incomeCostDetail.getComCode())))) {

if (incomeCostDetail.getIncomeSelfAmountCn() != null) {

incomeCostDetail.setIncomeSelfAmountCnFina(incomeCostDetail.getIncomeSelfAmountCn());

}

} else if ("转口".equals(incomeCostDetail.getBusiType()) && ("1445".equals(incomeCostDetail.getComCode()))) {

if (incomeCostDetail.getIncomeSelfAmount() != null && rate!=null) {

incomeCostDetail.setIncomeSelfAmountCnFina(incomeCostDetail.getIncomeSelfAmountCn().multiply(rate));

}

}

if ("转口".equals(incomeCostDetail.getBusiType()) && incomeCostDetail.getRate() != null && incomeCostDetail.getRate().compareTo(BigDecimal.ONE) == 0) {

incomeCostDetail.setInvoOutAmountCn(incomeCostDetail.getInvoOutAmountCn().multiply(incomeCostDetail.getRate()));

}

});

return incomeCostDetails;

}

@Override

public void export(IRequest requestContext, HttpServletRequest request, InvomeCostDetail costDetail, HttpServletResponse httpServletResponse) throws IOException {

String fileName = "收入成本毛利表";

ServletOutputStream outputStream = EasyEacelUtils.createOutputStream(request, httpServletResponse, fileName);

try {

ExcelWriter writer = new ExcelWriter(outputStream, ExcelTypeEnum.XLSX);

Sheet sheet1 = new Sheet(1, 0, InvomeCostDetail.class);

Map columnWidth = new HashMap();

columnWidth.put(0, 5000);

columnWidth.put(1, 5000);

columnWidth.put(2, 5000);

columnWidth.put(3, 5000);

columnWidth.put(4, 5000);

columnWidth.put(5, 5000);

columnWidth.put(6, 5000);

columnWidth.put(7, 7000);

columnWidth.put(8, 7000);

columnWidth.put(9, 7000);

columnWidth.put(10, 7000);

columnWidth.put(11, 9000);

columnWidth.put(12, 7000);

columnWidth.put(13, 7000);

columnWidth.put(14, 9000);

columnWidth.put(15, 9000);

columnWidth.put(16, 10000);

columnWidth.put(17, 9000);

columnWidth.put(18, 7000);

columnWidth.put(19, 7000);

columnWidth.put(20, 7000);

columnWidth.put(21, 7000);

columnWidth.put(22, 7000);

sheet1.setColumnWidthMap(columnWidth);

sheet1.setHead(createListHeading(costDetail.getPostDateStart() == null ? null : new SimpleDateFormat("yyyy-MM-dd").format(costDetail.getPostDateStart()),

costDetail.getPostDateEnd() == null ? null : new SimpleDateFormat("yyyy-MM-dd").format(costDetail.getPostDateEnd())));

writer.write(loadReportData(requestContext, costDetail), sheet1);

writer.finish();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

outputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

private List> createListHeading(String startDate, String endDate) {

List> head = new ArrayList>();

List headCoulumn1 = new ArrayList();

List headCoulumn2 = new ArrayList();

List headCoulumn3 = new ArrayList();

List headCoulumn4 = new ArrayList();

List headCoulumn5 = new ArrayList();

List headCoulumn6 = new ArrayList();

List headCoulumn7 = new ArrayList();

List headCoulumn8 = new ArrayList();

List headCoulumn9 = new ArrayList();

List headCoulumn10 = new ArrayList();

List headCoulumn11 = new ArrayList();

List headCoulumn12 = new ArrayList();

List headCoulumn13 = new ArrayList();

List headCoulumn14 = new ArrayList();

List headCoulumn15 = new ArrayList();

List headCoulumn16 = new ArrayList();

List headCoulumn17 = new ArrayList();

List headCoulumn18 = new ArrayList();

List headCoulumn19 = new ArrayList();

List headCoulumn20 = new ArrayList();

List headCoulumn21 = new ArrayList();

List headCoulumn22 = new ArrayList();

List headCoulumn23 = new ArrayList();

List headCoulumn24 = new ArrayList();

List headCoulumn25 = new ArrayList();

List headCoulumn26 = new ArrayList();

headCoulumn1.add("收入成本毛利表");

headCoulumn1.add("开票起始日");

headCoulumn1.add("公司名称");

headCoulumn2.add("收入成本毛利表");

headCoulumn2.add(startDate);

headCoulumn2.add("销售客户");

headCoulumn3.add("收入成本毛利表");

headCoulumn3.add("");

headCoulumn3.add("合同号");

headCoulumn4.add("收入成本毛利表");

headCoulumn4.add("");

headCoulumn4.add("开票申请号");

headCoulumn5.add("收入成本毛利表");

headCoulumn5.add("");

headCoulumn5.add("过账日期");

headCoulumn6.add("收入成本毛利表");

headCoulumn6.add("");

headCoulumn6.add("业务类型");

headCoulumn7.add("收入成本毛利表");

headCoulumn7.add("开票截止日");

headCoulumn7.add("发票数量");

headCoulumn8.add("收入成本毛利表");

headCoulumn8.add(endDate);

headCoulumn8.add("发票金额(不含税)");

headCoulumn9.add("收入成本毛利表");

headCoulumn9.add(endDate);

headCoulumn9.add("发票金额(不含税-人民币)");

headCoulumn10.add("收入成本毛利表");

headCoulumn10.add("");

headCoulumn10.add("财务出库数量");

headCoulumn11.add("收入成本毛利表");

headCoulumn11.add("");

headCoulumn11.add("财务出库单价(原币)");

headCoulumn12.add("收入成本毛利表");

headCoulumn12.add("");

headCoulumn12.add("财务出库金额(原币)");

headCoulumn13.add("收入成本毛利表");

headCoulumn13.add("");

headCoulumn13.add("财务出库单价(人民币/吨)");

headCoulumn14.add("收入成本毛利表");

headCoulumn14.add("");

headCoulumn14.add("财务出库金额(元)");

headCoulumn15.add("收入成本毛利表");

headCoulumn15.add("");

headCoulumn15.add("财务出库汇率");

headCoulumn16.add("收入成本毛利表");

headCoulumn16.add("");

headCoulumn16.add("对应初始采购成本单价(原币)");

headCoulumn17.add("收入成本毛利表");

headCoulumn17.add("");

headCoulumn17.add("对应初始采购成本金额(原币)");

headCoulumn18.add("收入成本毛利表");

headCoulumn18.add("");

headCoulumn18.add("对应初始采购成本金额(元)");

headCoulumn19.add("收入成本毛利表");

headCoulumn19.add("");

headCoulumn19.add("对应初始采购成本单价(元/吨)");

headCoulumn20.add("收入成本毛利表");

headCoulumn20.add("");

headCoulumn20.add("对应初始财务入库汇率");

headCoulumn21.add("收入成本毛利表");

headCoulumn21.add("");

headCoulumn21.add("现货毛利(合并)原币");

headCoulumn22.add("收入成本毛利表");

headCoulumn22.add("");

headCoulumn22.add("现货毛利(合并)人民币");

headCoulumn23.add("收入成本毛利表");

headCoulumn23.add("");

headCoulumn23.add("现货毛利(合并)人民币-财务口径");

headCoulumn24.add("收入成本毛利表");

headCoulumn24.add("");

headCoulumn24.add("现货毛利(独立)原币");

headCoulumn25.add("收入成本毛利表");

headCoulumn25.add("");

headCoulumn25.add("现货毛利(独立)人民币");

headCoulumn26.add("收入成本毛利表");

headCoulumn26.add("");

headCoulumn26.add("现货毛利(独立)人民币-财务口径");

head.add(headCoulumn1);

head.add(headCoulumn2);

head.add(headCoulumn3);

head.add(headCoulumn4);

head.add(headCoulumn5);

head.add(headCoulumn6);

head.add(headCoulumn7);

head.add(headCoulumn8);

head.add(headCoulumn9);

head.add(headCoulumn10);

head.add(headCoulumn11);

head.add(headCoulumn12);

head.add(headCoulumn13);

head.add(headCoulumn14);

head.add(headCoulumn15);

head.add(headCoulumn16);

head.add(headCoulumn17);

head.add(headCoulumn18);

head.add(headCoulumn19);

head.add(headCoulumn20);

head.add(headCoulumn21);

head.add(headCoulumn22);

head.add(headCoulumn23);

head.add(headCoulumn24);

head.add(headCoulumn25);

head.add(headCoulumn26);

return head;

}

}

官方示例demo

ExcelWriter writer = EasyExcelFactory.getWriter(out);

//写第一个sheet, sheet1 数据全是List 无模型映射关系

Sheet sheet1 = new Sheet(1, 3);

sheet1.setSheetName("第一个sheet");

//设置列宽 设置每列的宽度

Map columnWidth = new HashMap();

columnWidth.put(0,10000);columnWidth.put(1,40000);columnWidth.put(2,10000);columnWidth.put(3,10000);

sheet1.setColumnWidthMap(columnWidth);

sheet1.setHead(createTestListStringHead());

//or 设置自适应宽度

//sheet1.setAutoWidth(Boolean.TRUE);

writer.write1(createTestListObject(), sheet1);

//写第二个sheet sheet2 模型上打有表头的注解,合并单元格

Sheet sheet2 = new Sheet(2, 3, JavaModel1.class, "第二个sheet", null);

sheet2.setTableStyle(createTableStyle());

writer.write(createTestListJavaMode(), sheet2);

//写第三个sheet包含多个table情况

Sheet sheet3 = new Sheet(3, 0);

sheet3.setSheetName("第三个sheet");

Table table1 = new Table(1);

table1.setHead(createTestListStringHead());

writer.write1(createTestListObject(), sheet3, table1);

//写sheet2 模型上打有表头的注解

Table table2 = new Table(2);

table2.setTableStyle(createTableStyle());

table2.setClazz(JavaModel1.class);

writer.write(createTestListJavaMode(), sheet3, table2);

//关闭资源

writer.finish();

out.close();

总结

以上举例是常用的两种组装数据成excel的方法,第一种适用常规的excel导出,但是表头不能控制,数据也必须跟dto中对应,限制相对大一点。第二种方法灵活行比较大,表头可以自己组装,数据也不用局限dto。在实际运用中就最大的不同就是第二种可以做动态列,但是由于第一种因为其局限性就无法完成动态列的实现,但是它却省了很多功夫来组装数据。两者各有优劣,就看实际的业务需求了。

当然还有同一个sheet中使用table来实现两部分数据块的展示方法等等,这些都可以从官方文档中找个具体的使用方法。这里就不做详细阐述了,本文主要就是讲解数据的组装逻辑方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

财会专用计算机,一种财会专用计算机的制作方法

技术特征&#xff1a;1.一种财会专用计算机&#xff0c;包括计算机本体(3)&#xff0c;其特征在于&#xff0c;所述计算机本体(3)的顶部固定安装有账本板(2)&#xff0c;所述账本板(2)的中部对称安装有账本夹(1)&#xff0c;所述计算机本体(3)内置有无线信号接收器(7)&#xff…

realtek网卡mac硬改工具_七彩虹联合Realtek发布粉色固态硬盘 首发评测

七彩虹是PC行业领先的科技企业&#xff0c;其中在板卡领域是大陆第一的品牌&#xff0c;而在存储领域也常常被行业称为四大金刚之一。小螃蟹瑞昱(Realtek)是领先的专业IC设计公司&#xff0c;其中广为大家所认知的是网卡芯片、声卡芯片——这两个领域几乎是霸主地位。同时在WiF…

计算机基础及应用笔试,计算机基础及应用测试笔试题

计算机基础及应用测试笔试题站点&#xff1a;专业&#xff1a;学号&#xff1a;一、选择题1.下面文件扩展名是不可以直接运行的是&#xff1a;A、.exeB、.doc、C、.com2.计算机将数据暂存在中等待处理。A、内存B、硬盘C、主板3.在CPU中&#xff0c;执行加减等算术运算操作以及比…

vue 修改模板{{}}标签_vue-admin-template模板添加tagsview

参考&#xff1a;一、从vue-element-admin复制文件&#xff1a;vue-admin-template\src\layout\components\TagsView 文件夹vue-admin-template\src\store\modules\tagsView.js#vue-admin-template\static 文件夹#vue-admin-template\src\lang 文件夹#vue-admin-template\src\…

python中locals函数_Python神奇的内置函数locals的实例讲解

摘要本文我们介绍神奇的locals函数&#xff0c;包括动态创建变量和动态访问变量&#xff0c;以及一个应用场景。相同属性不相邻问题需求&#xff1a;有两个list&#xff0c;分别为list1和list2。list1中有n个对象&#xff0c;每个对象有5个属性&#xff0c;其中一个属性是tid&a…

微型计算机继电器控制,可编程控制器与微机及继电器控制的区别 -解决方案-华强电子网...

1. PC与MC控制的区别简而言之&#xff0c;MC是通用的专用机&#xff0c;而PC则是专用的通用机。从微型计算机的应用范围来说&#xff0c;MC是通用机&#xff0c;而PC是专用机。微型计算机是在以往计算机与大规模集成电路的基础上发展起来的&#xff0c;它最大特征是运算速度快&…

vue点击按钮上传图片_关于javascript:Vue-点击按钮提交表单

我有一个组件&#xff0c;用户可以在其中上传图像&#xff0c;我还想添加一个删除图像的功能。 我添加了一个按钮&#xff0c;该按钮可删除当前图像&#xff0c;但是它的问题在于表单也正在提交&#xff0c;因此我想避免这种情况。 我只需要删除当前图像(如果存在)。 这是脚本&…

计算机与自动化专业有哪些学校,全国自动化专业大学排名

自动化专业大学排名已经公布啦&#xff0c;下面由出国留学网小编为你精心准备了“2020自动化专业大学排名公布”&#xff0c;持续关注本站将可以持续获取更多的考试资讯!2020自动化专业大学排名公布自动化专业最好的大学有哪几所&#xff0c;中国哪些本科大学自动化专业实力最强…

黑苹果uhd630黑屏_求助各位图吧大佬一个黑苹果问题(黑苹果吧发帖得四级),目前使...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼以下是换回auto重启之后系统给的报错信息&#xff1a;panic(cpu 5 caller 0xffffff7f9fc4272f): assertmsg/Library/Caches/com.apple.xbs/Sources/ GPUDriversIntel/GPUDriversIntel-14.7.8/IONDRV/CFL/AppleIntelFramebuffer/ 网…

南京理工大学计算机学院教授严捍,2019年7月1日学术报告二则(宋巍 教授,南京理工大学;张鹏程 副教授,河海大学)...

报告题目1&#xff1a;过程分析与挖掘报告时间&#xff1a;2019年7月1日(周一)上午9:30报告地点&#xff1a;计算机学院E202报告人&#xff1a;宋巍报告人单位&#xff1a;南京理工大学报告人简介&#xff1a;宋巍&#xff0c;南京理工大学计算机科学与工程学院教授、博士生导师…

用友无法打开计算机的ufnet服务,服务器安装完毕登陆正常,但是客户端安装完毕,重启以后,用友通无法正常启动,手工在服务里面启动,提示‘服务无法启动或依存的标记被删除’...

问题现象&#xff1a;服务器安装完毕登陆正常&#xff0c;但是客户端安装完毕&#xff0c;重启以后&#xff0c;用友用友T3服务无法正常启动&#xff0c;手工在服务里面启动&#xff0c;提示‘服务无法启动或依存的标记被删除’问题模块&#xff1a;系统环境关键字&#xff1a;…

分号与逗号的区别及举例_如何掌握分号的用法 和顿号有什么区别

如何掌握分号的用法 和顿号有什么区别2019-03-08 15:57:09文/李男考试中作文成绩因为标点符号丢分的情况时有发生&#xff0c;看到这样丢分的情况&#xff0c;令人叹息。下面小编整理了一些关于分号的用法&#xff0c;供大家参考!分号的用法有哪些下列几种情况使用分号①用在复…

poi获取段落位置_apache poi word提取段落

本文概述要提取段落文本&#xff0c;我们使用XWPFDocument类的getParagraphs()方法。此方法返回文档所有段落的列表&#xff0c;这些列表可以存储在列表变量中并通过迭代循环获取。让我们看一个使用Java程序提取段落的示例。Apache POI提取段落示例package poiexample;import j…

计算机校本培训心得,个人校本培训心得体会3篇

校本培训是与学校、教师的实际紧密结合&#xff0c;以提高教师的师德修养和教育教学的实践能力为基本目标。下面是学习啦带来的个人校本培训心得体会&#xff0c;仅供参考。个人校本培训心得体会一&#xff1a;转眼间本学期已到尾声&#xff0c;回顾在本学期校本培训期间&#…

python中dict转换成list_python里dict变成list实例方法

python里dict(字典)怎么变成list(列表)?说明&#xff1a;列表不可以转换为字典1、转换后的列表为无序列表a {a : 1, b: 2, c : 3}#字典中的key转换为列表key_value list(a.keys())print(字典中的key转换为列表&#xff1a;, key_value)#字典中的value转换为列表value_list …

高中发表在论文计算机方面,高中计算机教学论文

高中计算机教学论文引导语&#xff1a;人们的生活已经离不开计算机&#xff0c;计算机已走进千家万户&#xff0c;由此可见学好计算机是一件非常重要的事情&#xff0c;那么相关的高职计算机教学论文要怎么写呢&#xff1f;接下来是小编为你带来收集整理的文章&#xff0c;欢迎…

android 代码设置居右_Android 开发实现EditText 光标居右显示

Android 开发实现EditText 光标居右显示前言&#xff1a;有些时候肯定会遇到这种奇葩的需求&#xff0c;光标要靠右显示&#xff0c;因为Android里面光标默认是靠左显示的&#xff0c;那怎么实现呢&#xff0c;肯定有办法的&#xff0c;这里提供一种实现方式&#xff0c;看布局…

计算机控制lc72131,lc72131(1)

----------------------- Page 1-----------------------LC72131锁相环频率合成器概述与特点LC72131 是一种锁相环频率合成器。该电路的特点如下&#xff1a;1.高速可编程分频器FMIN&#xff1a; 10--160MHz……………双模式预分频(内置二分频器)AMIN: 2--40MHz ……………双模…

jupyter ipython display_IPythonJupyter私房手册

Jupyter是以Ipython为基础&#xff0c;可以极大的方便开发&#xff0c;对于如何使用&#xff0c;网上的资料都不太全。因此决定自己编写一个私房手册方便随时查找。1. 安装和配置安装不多说&#xff0c;不想折腾直接安装anaconda包&#xff0c;集成了Jupyter和Ipython。主要说说…

计算机一级b考试教程,全国计算机等级考试一级B教程

第一章 计算机基础知识1.1 概述1.1.1 什么是计算机1.1.2 计算机的发展概况1.1.3 计算机的应用领域1.1.4 计算机的应用领域1.2 计算机中的数与编码1.2.1 二进制的基本概念1.2.2 编码1.3 计算机程序设计语言1.3.1 机器语言1.3.2 汇编语言1.3.3 高级语言1.4 计算机的…