|
|
@@ -0,0 +1,484 @@
|
|
|
+package com.usoftchina.saas.commons.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.usoftchina.saas.commons.dto.ProductBaseDTO;
|
|
|
+import com.usoftchina.saas.commons.exception.BizExceptionCode;
|
|
|
+import com.usoftchina.saas.commons.mapper.DataImportDetailMapper;
|
|
|
+import com.usoftchina.saas.commons.mapper.DataImportMapper;
|
|
|
+import com.usoftchina.saas.commons.mapper.DataTempletMapper;
|
|
|
+import com.usoftchina.saas.commons.po.*;
|
|
|
+import com.usoftchina.saas.commons.service.ExcelService;
|
|
|
+import com.usoftchina.saas.context.BaseContextHolder;
|
|
|
+import com.usoftchina.saas.exception.BizException;
|
|
|
+import com.usoftchina.saas.utils.CollectionUtils;
|
|
|
+import com.usoftchina.saas.utils.StringUtils;
|
|
|
+import org.apache.poi.hssf.util.HSSFColor;
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
+import org.apache.poi.ss.util.CellRangeAddress;
|
|
|
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author: guq
|
|
|
+ * @create: 2018-11-26 15:19
|
|
|
+ **/
|
|
|
+@Service
|
|
|
+public class ExcelServiceImpl implements ExcelService{
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DataTempletMapper dataTempletMapper;
|
|
|
+ @Autowired
|
|
|
+ private DataImportMapper dataImportMapper;
|
|
|
+ @Autowired
|
|
|
+ private DataImportDetailMapper dataImportDetailMapper;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> CreateTemplet(String caller) {
|
|
|
+ Long companyId = BaseContextHolder.getCompanyId();
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ SXSSFWorkbook workbook = new SXSSFWorkbook();
|
|
|
+ DataTemplet dataTemplet = dataTempletMapper.selectByCaller(caller, companyId);
|
|
|
+ String cols = dataTemplet.getDt_columns();
|
|
|
+ /* String cols = "[{\"description\":\"物料编号\",\"necessary\":\"true\"},{\"description\":\"物料名称\",\"necessary\":\"true\"},{\"description\":\"物料类型\",\"necessary\":\"true\"},{\"description\":\"仓库编号\",\"necessary\":\"true\"},{\"description\":\"仓库名称\",\"necessary\":\"true\"}]";
|
|
|
+ cols = "[{\"description\":\"物料编号\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_code\",\"codefield\":true}," +
|
|
|
+ "{\"description\":\"物料名称\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_detail\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"更新时间\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"updateTime\",\"codefield\":false,\"type\":\"date\"}," +
|
|
|
+ "{\"description\":\"规格\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_spec\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"类型\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_kind\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"型号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_orispeccode\",\"codefield\":false}" +
|
|
|
+ ",{\"description\":\"品牌\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_brand\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"单位\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_unit\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"仓库编号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whcode\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"仓库名称\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whname\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"最新采购单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_purcprice\",\"codefield\":false}" +
|
|
|
+ ",{\"description\":\"最新出货单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_saleprice\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"替代料仓库编号\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_whcode\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"替代料仓库名称\",\"necessary\":\"false\",\"position\":\"detail\",\"field\":\"pd_whname\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"期初数量\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_num\",\"codefield\":false}," +
|
|
|
+ "{\"description\":\"单位成本\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_price\",\"codefield\":false}]";
|
|
|
+ */
|
|
|
+ JSONArray array = (JSONArray) JSONArray.parse(cols);
|
|
|
+ String remark = dataTemplet.getDt_description();
|
|
|
+ //String exampledata = dataTemplet.getDt_exampledata();
|
|
|
+ //JSONArray datas = (JSONArray) JSONArray.parse(exampledata);
|
|
|
+ JSONArray datas = new JSONArray();
|
|
|
+ JSONObject data = new JSONObject();
|
|
|
+ data.put("物料编号", "code1");
|
|
|
+ data.put("物料名称", "name1");
|
|
|
+ data.put("规格", "spec1");
|
|
|
+ data.put("型号", "kind1");
|
|
|
+ data.put("品牌", "brand1");
|
|
|
+ data.put("更新时间", "2018-09-08");
|
|
|
+ data.put("单位", "nuit1");
|
|
|
+ data.put("类型", "leixin1");
|
|
|
+ data.put("仓库编号", "whcode1");
|
|
|
+ data.put("仓库名称", "whname1");
|
|
|
+ data.put("最新采购单价", "100");
|
|
|
+ data.put("最新出货单价", "22");
|
|
|
+ data.put("替代料仓库编号", "tcode1");
|
|
|
+ data.put("替代料仓库名称", "tname1");
|
|
|
+ data.put("期初数量", "22");
|
|
|
+ data.put("单位成本", "22");
|
|
|
+ datas.add(data);
|
|
|
+ JSONObject data2 = new JSONObject();
|
|
|
+ data2.put("物料编号", "code2");
|
|
|
+ data2.put("物料名称", "name2");
|
|
|
+ data2.put("规格", "spec2");
|
|
|
+ data2.put("型号", "kind2");
|
|
|
+ data2.put("品牌", "brand2");
|
|
|
+ data2.put("单位", "nuit2");
|
|
|
+ data2.put("类型", "leixin2");
|
|
|
+ data2.put("仓库编号", "whcode2");
|
|
|
+ data2.put("仓库名称", "whname2");
|
|
|
+ data2.put("最新采购单价", "100");
|
|
|
+ data2.put("最新出货单价", "22");
|
|
|
+ data2.put("替代料仓库编号", "tcode2");
|
|
|
+ data2.put("替代料仓库名称", "tname2");
|
|
|
+ data2.put("期初数量", "22");
|
|
|
+ data2.put("单位成本", "22");
|
|
|
+ datas.add(data2);
|
|
|
+ System.out.println(datas.toJSONString());
|
|
|
+ createWorkbook(workbook, 1, array, datas, remark);
|
|
|
+ map.put("workbook", workbook);
|
|
|
+ map.put("title", dataTemplet.getDt_title());
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void clearBefore(String caller) {
|
|
|
+ Long companyId = BaseContextHolder.getCompanyId();
|
|
|
+ String ids = dataImportMapper.selectByCaller(caller, companyId);
|
|
|
+ if (!StringUtils.isEmpty(ids)) {
|
|
|
+ dataImportDetailMapper.deleteByIds(ids);
|
|
|
+ dataImportMapper.deleteByIds(ids);
|
|
|
+ };
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public Integer parseTemplet(Workbook wb, String caller) {
|
|
|
+ if (wb == null || StringUtils.isEmpty(caller)) {
|
|
|
+ throw new BizException(BizExceptionCode.NULL_DATA);
|
|
|
+ }
|
|
|
+ Long companyId = BaseContextHolder.getCompanyId();
|
|
|
+ DataImport di = new DataImport();
|
|
|
+ di.setCompanyid(companyId);
|
|
|
+ di.setDi_caller(caller);
|
|
|
+ di.setDi_date(new Date());
|
|
|
+ di.setDi_man(BaseContextHolder.getUserName());
|
|
|
+ di.setDi_toformal(0);
|
|
|
+ di.setDi_success(0);
|
|
|
+ List<Map<String,String>> datas = new ArrayList<Map<String,String>>();
|
|
|
+ String cols = "[{\"description\":\"物料编号\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_code\",\"codefield\":true}," +
|
|
|
+ "{\"description\":\"物料名称\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_detail\",\"codefield\":false},{\"description\":\"规格\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_spec\",\"codefield\":false},{\"description\":\"类型\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_kind\",\"codefield\":false},{\"description\":\"型号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_orispeccode\",\"codefield\":false}" +
|
|
|
+ ",{\"description\":\"品牌\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_brand\",\"codefield\":false},{\"description\":\"单位\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_unit\",\"codefield\":false},{\"description\":\"仓库编号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whcode\",\"codefield\":false},{\"description\":\"仓库名称\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whname\",\"codefield\":false},{\"description\":\"最新采购单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_purcprice\",\"codefield\":false}" +
|
|
|
+ ",{\"description\":\"最新出货单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_saleprice\",\"codefield\":false},{\"description\":\"替代料仓库编号\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_whcode\",\"codefield\":false},{\"description\":\"替代料仓库名称\",\"necessary\":\"false\",\"position\":\"detail\",\"field\":\"pd_whname\",\"codefield\":false},{\"description\":\"期初数量\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_num\",\"codefield\":false},{\"description\":\"单位成本\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_price\",\"codefield\":false}]";
|
|
|
+ //前端列表信息
|
|
|
+ List<TempletSet> templetSets = JSONArray.parseArray(cols, TempletSet.class);
|
|
|
+ Map<String, List<TempletSet>> columns = CollectionUtils.groupBy(templetSets, TempletSet::getPosition);
|
|
|
+ List<String> positions = SetToList(columns.keySet());
|
|
|
+ String cellData = null;
|
|
|
+ String codeValue = null;
|
|
|
+ //读取默认从第2行开始读取
|
|
|
+ List<String> keys = new ArrayList<>();
|
|
|
+ //获取第一个sheet
|
|
|
+ Sheet sheet = wb.getSheetAt(0);
|
|
|
+ //获取最大行数
|
|
|
+ int rownum = sheet.getPhysicalNumberOfRows();
|
|
|
+ if (rownum < 3) {
|
|
|
+ throw new BizException(12324, "请先填写数据");
|
|
|
+ }
|
|
|
+ //获取第2行
|
|
|
+ Row row = sheet.getRow(1);
|
|
|
+ //获取最大列数
|
|
|
+ int colnum = row.getPhysicalNumberOfCells();
|
|
|
+ String key = null;
|
|
|
+ //添加keys
|
|
|
+ for (int j = 0;j < colnum; j++){
|
|
|
+ key = (String) getCellFormatValue(row.getCell(j));
|
|
|
+ keys.add(key);
|
|
|
+ }
|
|
|
+ //存储数据
|
|
|
+ for (int i = 2; i < rownum; i++) {
|
|
|
+ Map<String,String> map = new LinkedHashMap<String,String>();
|
|
|
+ row = sheet.getRow(i);
|
|
|
+ if(row !=null){
|
|
|
+ for (int j = 0;j < colnum; j++){
|
|
|
+ cellData = (String) getCellFormatValue(row.getCell(j));
|
|
|
+ //检测字段必填与否
|
|
|
+ map.put(keys.get(j), cellData);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ datas.add(map);
|
|
|
+ }
|
|
|
+ dataImportMapper.insertSelective(di);
|
|
|
+ Integer keyvalue = di.getDi_id();
|
|
|
+ //数据转换成字段
|
|
|
+ if (!CollectionUtils.isEmpty(datas)) {
|
|
|
+ StringBuilder err = new StringBuilder();
|
|
|
+ JSONArray mains = new JSONArray();
|
|
|
+ JSONArray details = new JSONArray();
|
|
|
+ boolean flag = false;
|
|
|
+ //数据行循环
|
|
|
+ for (int i = 0; i < datas.size(); i++) {
|
|
|
+ Map<String,String> data = datas.get(i);
|
|
|
+ DataImportDetail dd = new DataImportDetail();
|
|
|
+ //界面值
|
|
|
+ String value = null;
|
|
|
+ JSONObject mainData = null;
|
|
|
+ JSONObject detailData = null;
|
|
|
+ dd.setCompanyid(companyId);
|
|
|
+ dd.setDd_diid(keyvalue);
|
|
|
+ //主从表循环
|
|
|
+ for (int j = 0; j < positions.size(); j++) {
|
|
|
+ String position = positions.get(j);
|
|
|
+ //标识是否一个主表的数据
|
|
|
+ boolean difference = true;
|
|
|
+ //依据主从表分类
|
|
|
+ if ("main".equals(position)) {
|
|
|
+ List<TempletSet> main = columns.get(position);
|
|
|
+ for (TempletSet set : main) {
|
|
|
+ //取excel值
|
|
|
+ if ("true".equals(set.getNecessary())) {
|
|
|
+ value = data.get("*" + set.getDescription());
|
|
|
+ } else {
|
|
|
+ value = data.get(set.getDescription());
|
|
|
+ }
|
|
|
+ //取编号字段
|
|
|
+ if (set.isCodefield() && !data.get("*" + set.getDescription()).equals("")) {
|
|
|
+ mainData = new JSONObject();
|
|
|
+ codeValue = value;
|
|
|
+ difference = true;
|
|
|
+ }
|
|
|
+ //检查是否是同一单
|
|
|
+ if (set.isCodefield() && data.get("*" + set.getDescription()).equals("")) {
|
|
|
+ difference = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //检查主表必填字段是否完整
|
|
|
+ if (difference) {
|
|
|
+ dd.setDd_codevalue(codeValue);
|
|
|
+ if ("true".equals(set.getNecessary()) && data.get("*" + set.getDescription()).equals("")) {
|
|
|
+ err.append("第" + (i + 2) + "行 " + set.getDescription() + " 必填字段未填写! ");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //检测日期类型是否规范
|
|
|
+ if ("date".equals(set.getType())) {
|
|
|
+ flag = validateDateFormat(value);
|
|
|
+ if (!flag) {
|
|
|
+ err.append("第" + (i + 2) + "行 " + set.getDescription() + " 日期格式不正确! ");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //插入主表数据
|
|
|
+ if (null != mainData) {
|
|
|
+ if ("true".equals(set.getNecessary())) {
|
|
|
+ mainData.put(set.getField(), value);
|
|
|
+ } else {
|
|
|
+ mainData.put(set.getField(), value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //所有主表数据进行分类
|
|
|
+ if (null != mainData) {
|
|
|
+ //mains.add(mainData);
|
|
|
+ dd.setDd_maindata(mainData.toJSONString());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //从表字段
|
|
|
+ List<TempletSet> detail = columns.get(position);
|
|
|
+ detailData = new JSONObject();
|
|
|
+ for (TempletSet set : detail) {
|
|
|
+ //取excel值
|
|
|
+ if ("true".equals(set.getNecessary())) {
|
|
|
+ value = data.get("*" + set.getDescription());
|
|
|
+ } else {
|
|
|
+ value = data.get(set.getDescription());
|
|
|
+ }
|
|
|
+ //拼从表数据
|
|
|
+ if ("true".equals(set.getNecessary())) {
|
|
|
+ detailData.put(set.getField(), data.get("*" + set.getDescription()));
|
|
|
+ } else {
|
|
|
+ detailData.put(set.getField(), data.get(set.getDescription()));
|
|
|
+ }
|
|
|
+ if ("true".equals(set.getNecessary()) && data.get("*" + set.getDescription()).equals("")) {
|
|
|
+ err.append("第" + (i + 2) + "行 " + set.getDescription() + " 必填字段未填写! ");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //检测日期类型是否规范
|
|
|
+ if ("date".equals(set.getType())) {
|
|
|
+ flag = validateDateFormat(value);
|
|
|
+ if (!flag) {
|
|
|
+ err.append("第" + (i + 2) + "行 " + set.getDescription() + " 日期格式不正确! ");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (detailData.size() > 0) {
|
|
|
+ dd.setDd_codevalue(codeValue);
|
|
|
+ dd.setDd_detaildata(detailData.toJSONString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dataImportDetailMapper.insertSelective(dd);
|
|
|
+ }
|
|
|
+ //必填项检查
|
|
|
+ if (err.length() > 0) {
|
|
|
+ dataImportMapper.updateErr(err.toString(), keyvalue);
|
|
|
+ throw new BizException(123456789, err.toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return keyvalue;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private boolean validateDateFormat(String date) {
|
|
|
+ boolean flag = false;
|
|
|
+ if (StringUtils.isEmpty(date)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ String regEx1 = "[0-9]{8}";
|
|
|
+ String regEX2 = "[0-9]{4}-[0-9]{2}-[0-9]{2}";
|
|
|
+ // 编译正则表达式
|
|
|
+ Pattern pattern1 = Pattern.compile(regEx1);
|
|
|
+ Pattern pattern2 = Pattern.compile(regEX2);
|
|
|
+ Matcher matcher = pattern1.matcher(date);
|
|
|
+ // 字符串是否与正则表达式相匹配
|
|
|
+ flag = matcher.matches();
|
|
|
+ if (!flag) {
|
|
|
+ flag = pattern2.matcher(date).matches();
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ //保证先遍历主表
|
|
|
+ private List<String> SetToList(Set<String> sets) {
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ list.add("main");
|
|
|
+ for (String str : sets) {
|
|
|
+ if (!"main".equals(str)) {
|
|
|
+ list.add(str);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Object getCellFormatValue(Cell cell){
|
|
|
+ Object cellValue = null;
|
|
|
+ if(cell!=null){
|
|
|
+ //判断cell类型
|
|
|
+ switch(cell.getCellType()){
|
|
|
+ case Cell.CELL_TYPE_NUMERIC:{
|
|
|
+ cellValue = String.valueOf(cell.getNumericCellValue());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case Cell.CELL_TYPE_FORMULA:{
|
|
|
+ //判断cell是否为日期格式
|
|
|
+ if(DateUtil.isCellDateFormatted(cell)){
|
|
|
+ //转换为日期格式YYYY-mm-dd
|
|
|
+ cellValue = cell.getDateCellValue();
|
|
|
+ }else{
|
|
|
+ //数字
|
|
|
+ cellValue = String.valueOf(cell.getNumericCellValue());
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case Cell.CELL_TYPE_STRING:{
|
|
|
+ cellValue = cell.getRichStringCellValue().getString();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ cellValue = "";
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ cellValue = "";
|
|
|
+ }
|
|
|
+ return cellValue;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ protected Cell getCell(Sheet sheet, int row, int col) {
|
|
|
+ Row sheetRow = sheet.getRow(row);
|
|
|
+ if (sheetRow == null) {
|
|
|
+ sheetRow = sheet.createRow(row);
|
|
|
+ }
|
|
|
+ Cell cell = sheetRow.getCell(col);
|
|
|
+ if (cell == null) {
|
|
|
+ cell = sheetRow.createCell(col);
|
|
|
+ }
|
|
|
+ return cell;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成excel工作表
|
|
|
+ *
|
|
|
+ * 数据
|
|
|
+ */
|
|
|
+ private void createWorkbook(SXSSFWorkbook workbook, int sheetIdx, JSONArray cols, JSONArray datas, String remark){
|
|
|
+ Sheet sheet = workbook.createSheet("sheet" + sheetIdx);
|
|
|
+ CellStyle style = getCellStyle(workbook);
|
|
|
+ //sheet.autoSizeColumn((short) 2);
|
|
|
+ sheet.createFreezePane(0, 1);// 固定列
|
|
|
+ Cell cell = null;
|
|
|
+ int rIdx = 0;
|
|
|
+ int cIdx = 0;
|
|
|
+ short width = 0;
|
|
|
+ DataFormat format = workbook.createDataFormat();
|
|
|
+ Row row = null;
|
|
|
+ if (remark != null) {
|
|
|
+ row = sheet.createRow(rIdx);
|
|
|
+ row.setHeightInPoints((short) 100);
|
|
|
+ sheet.setColumnWidth(cIdx, 1000);
|
|
|
+ cell = getCell(sheet, rIdx, cIdx);
|
|
|
+ cell.setCellValue(remark);
|
|
|
+ sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cols.size() - 1));
|
|
|
+ rIdx++;
|
|
|
+ }
|
|
|
+ row = sheet.createRow(rIdx);
|
|
|
+ row.setHeightInPoints((short) 22);
|
|
|
+ List<String> keys = new ArrayList<String>();
|
|
|
+ if (!CollectionUtils.isEmpty(cols)) {
|
|
|
+ String value = "";
|
|
|
+ //列出主表的列
|
|
|
+ for (int i = 0; i < cols.size(); i++) {
|
|
|
+ JSONObject obj = (JSONObject) cols.get(i);
|
|
|
+ width = (short) (obj.get("width") == null ? 0 : (int)obj.get("width")*35.7);
|
|
|
+ width = width == 0 ? 4000 : width;
|
|
|
+ sheet.setColumnWidth(cIdx, width);
|
|
|
+ sheet.createFreezePane(cols.size() + 1, 2);
|
|
|
+ cell = getCell(sheet, rIdx, cIdx);
|
|
|
+ value = obj.get("description") == null ? value : obj.get("description").toString();
|
|
|
+ if ("true".equals(obj.get("necessary"))) {
|
|
|
+ value = "*" + value;
|
|
|
+ }
|
|
|
+ cell.setCellValue(value);
|
|
|
+ keys.add(String.valueOf(obj.get("description")));
|
|
|
+ if ("date".equals(obj.get("type"))) {
|
|
|
+ short df= workbook.createDataFormat().getFormat("yyyy-MM-dd");
|
|
|
+ style.setDataFormat(df);
|
|
|
+ }
|
|
|
+ cell.setCellStyle(style);
|
|
|
+ cIdx++;
|
|
|
+ value = "";
|
|
|
+ }
|
|
|
+ rIdx++;
|
|
|
+ if (!CollectionUtils.isEmpty(datas)) {
|
|
|
+ for(Object d :datas) {
|
|
|
+ JSONObject data = (JSONObject)d;
|
|
|
+ cIdx = 0;
|
|
|
+ row = sheet.createRow(rIdx);
|
|
|
+ row.setHeightInPoints((short) 20);
|
|
|
+ for (String key : keys) {
|
|
|
+ Cell c = getCell(sheet, rIdx, cIdx);
|
|
|
+ if (data.get(key) != null) {
|
|
|
+ String v = String.valueOf(data.get(key));
|
|
|
+ if ("".equals(v) || "null".equals(v)) {
|
|
|
+ c.setCellValue(0);
|
|
|
+ } else if (!v.matches("^-?[0-9]+(.[0-9]+)?")) {
|
|
|
+ c.setCellValue(v);
|
|
|
+ } else {
|
|
|
+ c.setCellValue(Double.parseDouble(v.replace(",", "")));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ c.setCellValue("");
|
|
|
+ }
|
|
|
+ cIdx++;
|
|
|
+ }
|
|
|
+ rIdx++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private CellStyle getCellStyle(SXSSFWorkbook workbook) {
|
|
|
+ CellStyle style = workbook.createCellStyle();
|
|
|
+ style.setFillBackgroundColor((short) 18);
|
|
|
+ style.setFillPattern(FillPatternType.LEAST_DOTS);
|
|
|
+ Font font = workbook.createFont();
|
|
|
+ font.setFontName("仿宋_GB2312");// 字体
|
|
|
+ font.setFontHeightInPoints((short) 12);// 字号
|
|
|
+ font.setColor((short)64);// 颜色
|
|
|
+ style.setFont(font);
|
|
|
+ style.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+ style.setFillForegroundColor(HSSFColor.GREEN.index);
|
|
|
+ style.setFillBackgroundColor(HSSFColor.PALE_BLUE.index);
|
|
|
+ style.setBorderBottom(BorderStyle.MEDIUM);
|
|
|
+ style.setBorderLeft(BorderStyle.MEDIUM);
|
|
|
+ style.setBorderRight(BorderStyle.MEDIUM);
|
|
|
+ style.setBorderTop(BorderStyle.MEDIUM);
|
|
|
+ return style;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|