html复杂标题+表格背景色
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 21210 | 13275 | 7936 | 10116 | 3484 | 6632 | -11094 | -9791 | -1304 |
海信洗衣机 | 4572 | 2168 | 2403 | 1072 | 458 | 614 | -3500 | -1710 | -1789 |
容声洗衣机 | 604 | 296 | 308 | 4 | 4 | 0 | -600 | -292 | -308 |
容声冰箱 | 9236 | 6482 | 2753 | 6916 | 2610 | 4306 | -2320 | -3872 | 1553 |
海信冷柜 | 807 | 338 | 469 | 80 | 0 | 80 | -727 | -338 | -389 |
容声酒柜 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
容声冷柜 | 1803 | 562 | 1241 | 352 | 92 | 260 | -1451 | -470 | -981 |
海信冰箱 | 4189 | 3428 | 761 | 1692 | 320 | 1372 | -2497 | -3108 | 611 |
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 6101 | 4319 | 1782 | 4708 | 1668 | 3040 | -1393 | -2651 | 1258 |
容声冷柜 | 68 | 0 | 68 | 0 | 0 | 0 | -68 | 0 | -68 |
容声冰箱 | 4319 | 2918 | 1401 | 3835 | 1518 | 2317 | -484 | -1400 | 916 |
海信冷柜 | 42 | 0 | 42 | 0 | 0 | 0 | -42 | 0 | -42 |
海信冰箱 | 1666 | 1401 | 265 | 873 | 150 | 723 | -793 | -1251 | 458 |
海信洗衣机 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
容声酒柜 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
容声洗衣机 | 5 | 0 | 5 | 0 | 0 | 0 | -5 | 0 | -5 |
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 36 | 0 | 36 | 0 | 0 | 0 | -36 | 0 | -36 |
海信洗衣机 | 36 | 0 | 36 | 0 | 0 | 0 | -36 | 0 | -36 |
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 2085 | 1524 | 561 | 661 | 400 | 261 | -1424 | -1124 | -300 |
容声冰箱 | 881 | 458 | 423 | 491 | 230 | 261 | -390 | -228 | -162 |
海信冰箱 | 1204 | 1066 | 138 | 170 | 170 | 0 | -1034 | -896 | -138 |
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 1943 | 1377 | 567 | 1246 | 632 | 614 | -697 | -745 | 47 |
容声冰箱 | 1262 | 1017 | 245 | 1216 | 632 | 584 | -46 | -385 | 339 |
海信冰箱 | 77 | 58 | 19 | 10 | 0 | 10 | -67 | -58 | -9 |
容声冷柜 | 561 | 301 | 259 | 20 | 0 | 20 | -541 | -301 | -239 |
海信冷柜 | 44 | 0 | 44 | 0 | 0 | 0 | -44 | 0 | -44 |
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 1 | 0 | 1 | 0 | 0 | 0 | -1 | 0 | -1 |
容声冰箱 | 1 | 0 | 1 | 0 | 0 | 0 | -1 | 0 | -1 |
海信冰箱 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 98 | 30 | 68 | 120 | 0 | 120 | 22 | -30 | 52 |
海信洗衣机 | 87 | 30 | 57 | 120 | 0 | 120 | 33 | -30 | 63 |
容声洗衣机 | 11 | 0 | 11 | 0 | 0 | 0 | -11 | 0 | -11 |
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 10939 | 6024 | 4915 | 3381 | 784 | 2597 | -7558 | -5240 | -2318 |
海信冷柜 | 721 | 338 | 383 | 80 | 0 | 80 | -641 | -338 | -303 |
容声冰箱 | 2769 | 2089 | 680 | 1374 | 230 | 1144 | -1395 | -1859 | 464 |
容声冷柜 | 1175 | 261 | 914 | 332 | 92 | 240 | -843 | -169 | -674 |
海信洗衣机 | 4449 | 2138 | 2311 | 952 | 458 | 494 | -3497 | -1680 | -1817 |
海信冰箱 | 1238 | 903 | 335 | 639 | 0 | 639 | -599 | -903 | 304 |
容声洗衣机 | 588 | 296 | 292 | 4 | 4 | 0 | -584 | -292 | -292 |
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 4 | 0 | 4 | 0 | 0 | 0 | -4 | 0 | -4 |
容声冰箱 | 4 | 0 | 4 | 0 | 0 | 0 | -4 | 0 | -4 |
基地 | 合计 | 下单目标 | 下单实际 | 下单差异 | |||||
线上 | 线下 | 合计 | 线上 | 线下 | 合计 | 线上 | 线下 | ||
合计 | 4 | 0 | 4 | 0 | 0 | 0 | -4 | 0 | -4 |
容声冰箱 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
海信冰箱 | 4 | 0 | 4 | 0 | 0 | 0 | -4 | 0 | -4 |
package com.hisense.iam800;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ibm.wsdl.util.StringUtils;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
/*各个基地表格汇总*/
public class BaseTableUtils {
private static Logger logger = Logger.getLogger(TableUtils.class);
private static String styleCss=" style='table-layout: fixed;border:1px solid #cad9ea;padding:0 1em 0;width=100%;'";
private static String tdTitleCss=" style='text-align:center;vertical-align:middle;background:#E3E3A4'";
private static String tdTitleCss2=" style='text-align:center;vertical-align:middle;background:#FF9900'";
private static String tdCss=" style='text-align:center;vertical-align:middle;'";
// 时间处理类
static DataUtils dataUtils = new DataUtils();
public static void main(String[] args) {
List<BaseDto> baseList = getBaseApiData();
Map<String, Object> map=exportToKV(baseList);
Set<String> line=(LinkedHashSet<String>) map.get("line");
String allTable="<div style='width:100%; height:2800px; overflow:scroll;'>";
for(String n:line) {
allTable+=map.get(n);
logger.info("line>>>>>"+n+">>>allTable>>>>>>>>>>"+allTable);
}
allTable+="<div>";
logger.info(">>>allTable>>>>>>>>>>"+allTable);
// for(String n:line) {
// logger.info("line>>>>>"+n);
// }
//String content=(String) map.get("全基地合计");
//logger.info("content>>>>>>>>>>"+content);
}
public static String getAllContent(List<BaseDto> baseList) {
Map<String, Object> map=exportToKV(baseList);
Set<String> line=(LinkedHashSet<String>) map.get("line");
String allTable="<div style='width:100%; height:2800px; overflow:scroll;'>";
for(String n:line) {
allTable+=map.get(n);
logger.info("line>>>>>"+n+">>>allTable>>>>>>>>>>"+allTable);
}
allTable+="<div>";
logger.info(">>>allTable>>>>>>>>>>"+allTable);
return allTable;
}
public static Map<String, Object> exportToKV(List<BaseDto> base) {
//产品基地类型==表格内容
Map<String,Object> fileMap=new HashMap<>();
//基础分类数据
Set<String> lineBase=new LinkedHashSet(); //产品线-基地
lineBase.add("全基地合计");
for(BaseDto b:base) {
if(b.getProduct_line().equals("冰箱")) {
lineBase.add(b.getProduct_line()+b.getStorage_base());
} else {
continue;
}
}
lineBase.remove("冰箱全基地合计");
//k-V 产品线基地:汇总集合
Map<String,Object> typeList=new HashMap<>();
for(String type:lineBase) {
//产品线基地
List<BaseDto> list=new ArrayList<>();
BaseDto total=new BaseDto();
for(BaseDto b:base) {
if(org.apache.commons.lang3.StringUtils.isNotEmpty(b.getStorage_base())) {
//全品类
if(type.equals("全基地合计")&&type.equals(b.getStorage_base())&&b.getProduct_line().equals("冰箱")) {
//全品类---各个数据集合
if(!b.getGoods_type_name().contains("合计")) {
list.add(b);
}
//全品类---合计
if(b.getGoods_type_name().equals("合计")){
logger.info(">>>>111>>>>"+b.getGoods_type_name()+type);
total=new BaseDto();
total=b;
//合计对象
typeList.put("全品类合计", total);
}
}else if(!type.equals("全基地合计")&&b.getProduct_line().equals("冰箱")){
//产品线基地---各个数据集合
String str1=b.getProduct_line()+b.getStorage_base();
if(type.equals(str1)&&(!b.getGoods_type_name().contains("合计"))) {
list.add(b);
}
//产品线基地---合计
if(b.getGoods_type_name().equals("合计")){
total=b;
//合计对象
typeList.put("合计"+b.getProduct_line()+b.getStorage_base(), total);
}
}
}else {
continue;
}
}
typeList.put(type, list);
}
fileMap.put("line", lineBase);
//产品基地类型==表格内容封装
for (String t : lineBase) {
// 全部数据汇总
List<BaseDto> list = (List<BaseDto>) typeList.get(t);
BaseDto total=new BaseDto();
if(t.contains("冰箱")) {
total= (BaseDto) typeList.get("合计"+t);
}else if(t.contains("空调")){
total= (BaseDto) typeList.get("合计"+t);
} else if(t.contains("全基地合计")){
total= (BaseDto) typeList.get("全品类合计");
}
List<String> small=new ArrayList<>();
small.add("下单实际");
small.add("下单差异");
// 标题
String day = dataUtils.getYesterday(new Date(), 0);
String title = day + "--【" + t + "】-基地下单情况";
String allstr = //"<div style='width:1000px; height:280px; overflow:scroll;'>"+
"<table cellpadding='1' cellspacing='1' border='1'> "
+ "<caption align='top'>" + title + "</caption>";
// 动态标题
String t1 = getTitle(small);
// 动态标题数据
String t2 = getTitleDate(list,total,small);
allstr+=t1;
allstr+=t2;
allstr += "</table>";
//+ "</div>";
logger.info("【table-content】---"+allstr);
// 数据封装
fileMap.put(t, allstr);
}
return fileMap;
}
// 【动态标题】
private static String getTitle(List<String> small) {
String title="<tr "+styleCss+">" +
" <td"+tdTitleCss+" rowspan='2'>基地 </td>" +
" <td"+tdTitleCss+" rowspan='2'>合计 </td>" +
" <td"+tdTitleCss+" colspan='2'>下单目标</td>" ;
for(String sm:small) {
title+=" <td"+tdTitleCss+" colspan='3'>"+sm+"</td>" ;
}
title+="</tr> "
+ "<tr "+styleCss+">" +
" <td"+tdTitleCss2+"><div style='width:80px'>线上</div></td>" +
" <td"+tdTitleCss2+"><div style='width:80px'>线下</div></td>" ;
for(String sm:small) {
title+= "<td"+tdTitleCss2+"><div style='width:80px'>合计</div></td>"
+ "<td"+tdTitleCss2+"><div style='width:80px'>线上</div></td>"
+ "<td"+tdTitleCss2+"><div style='width:80px'>线下</div></td>" ;
}
title+= "</tr> ";
return title;
}
// 【动态数据】
private static String getTitleDate(List<BaseDto> list,BaseDto total, List<String> small) {
String titleData = "";
//合计行
titleData+="<tr "+styleCss+">" +
" <td"+tdCss+"><div style='width:80px'>合计</div></td>" +
" <td"+tdCss+"><div style='width:80px'>"+total.getObjective_all()+"</div></td>" +
" <td"+tdCss+"><div style='width:80px'>"+total.getOn_line_up_esqty()+"</div></td>" +
" <td"+tdCss+"><div style='width:80px'>"+total.getOn_line_down_esqty()+"</div></td>" ;
//实际下单
titleData+=
"<td"+tdCss+"><div style='width:80px'>"+total.getReality_all()+"</div></td>"
+ "<td"+tdCss+"><div style='width:80px'>"+total.getOn_line_up_reqty()+"</div></td>"
+ "<td"+tdCss+"><div style='width:80px'>"+total.getOn_line_down_reqty()+"</div></td>" ;
//差异下单
titleData+=
"<td"+tdCss+"><div style='width:80px'>"+total.getDifference_all()+"</div></td>"
+ "<td"+tdCss+"><div style='width:80px'>"+total.getOn_line_up_difference()+"</div></td>"
+ "<td"+tdCss+"><div style='width:80px'>"+total.getOn_line_down_difference()+"</div></td>" ;
titleData+= "</tr> ";
//基地行
for(BaseDto ba:list) {
titleData+="<tr "+styleCss+">" +
" <td"+tdCss+"><div style='width:80px'>"+ba.getGoods_type_name()+"</div></td>"+
" <td"+tdCss+"><div style='width:80px'>"+ba.getObjective_all()+"</div></td>" +
" <td"+tdCss+"><div style='width:80px'>"+ba.getOn_line_up_esqty()+"</div></td>" +
" <td"+tdCss+"><div style='width:80px'>"+ba.getOn_line_down_esqty()+"</div></td>";
//实际下单
titleData+=
"<td"+tdCss+"><div style='width:80px'>"+ba.getReality_all()+"</div></td>"
+ "<td"+tdCss+"><div style='width:80px'>"+ba.getOn_line_up_reqty()+"</div></td>"
+ "<td"+tdCss+"><div style='width:80px'>"+ba.getOn_line_down_reqty()+"</div></td>" ;
//差异下单
titleData+=
"<td"+tdCss+"><div style='width:80px'>"+ba.getDifference_all()+"</div></td>"
+ "<td"+tdCss+"><div style='width:80px'>"+ba.getOn_line_up_difference()+"</div></td>"
+ "<td"+tdCss+"><div style='width:80px'>"+ba.getOn_line_down_difference()+"</div></td>" ;
titleData+= "</tr>" ;
}
return titleData;
}
private static List<BaseDto> getBaseApiData() {
List<BaseDto> res = new ArrayList<>();
String date = dataUtils.getYesterday(new Date(), 0);
String url ="http://api-gw.hisense.com/sd/ords/edw_apex/sd/dwsd_lr_tf_base_daily_ship_p_s?user_key=47919b0749133c83a3f5cef2dc4fa290&";
// url += "zdate=2021-06-22";
url += "zdate=" + date;
logger.info("【调用接口API参数】0 时间=" + date + ">>>>>>>>url" + url);
String getData = HttpParam.Get(url);
JSONObject json = JSONObject.parseObject(getData);
//
String items = null;
if (json.get("items") == null) {
return res;
} else {
items = json.get("items") + "";
JSONArray jsons = JSONArray.parseArray(items);
for (int i = 0; i < jsons.size(); i++) {
BaseDto dto = JSONObject.toJavaObject(jsons.getJSONObject(i), BaseDto.class);
res.add(dto);
}
return res;
}
}
}
还没有评论,来说两句吧...