| | |
| | | for (Double v : h2032FreightCum.values()) { |
| | | if (v != null) provAbove += v; |
| | | } |
| | | Double provAboveWan = round(provAbove / 10000.0, 4); |
| | | Double provAboveWan = provAbove / 10000.0; |
| | | Double provTotal = freightCum(ftMap.get("æ¹åç"), month); |
| | | Double provBelow = provTotal == null ? null : round(provTotal - provAboveWan, 4); |
| | | Double provBelow = provTotal == null ? null : provTotal - provAboveWan; |
| | | Double provTotalYoy = freightCumYoy(ftMap.get("æ¹åç"), month); |
| | | double provAboveLast = 0.0; |
| | | for (Double v : h2032FreightCumLast.values()) { |
| | | if (v != null) provAboveLast += v; |
| | | } |
| | | Double provAboveYoy = provAboveLast == 0.0 ? null : round((provAbove - provAboveLast) / provAboveLast, 4); |
| | | Double provAboveYoy = provAboveLast == 0.0 ? null : (provAbove - provAboveLast) / provAboveLast; |
| | | Double provTotalLast = lastFreightCum(ftMap.get("æ¹åç"), month); |
| | | Double provBelowLast = provTotalLast == null ? null : round(provTotalLast - provAboveLast / 10000.0, 4); |
| | | Double provBelowLast = provTotalLast == null ? null : provTotalLast - provAboveLast / 10000.0; |
| | | Double provBelowYoy = provBelowLast == null || provBelowLast == 0.0 ? null |
| | | : round((provBelow - provBelowLast) / provBelowLast, 4); |
| | | : (provBelow - provBelowLast) / provBelowLast; |
| | | |
| | | for (String city : RegionUtil.cityList()) { |
| | | Double a = h2032FreightCum.get(city); |
| | | double aWan = a == null ? 0.0 : round(a / 10000.0, 4); |
| | | double aWan = a == null ? 0.0 : a / 10000.0; |
| | | Double t = freightCum(ftMap.get(city), month); |
| | | above.put(city, aWan); |
| | | total.put(city, t); |
| | | below.put(city, t == null ? null : round(t - aWan, 4)); |
| | | below.put(city, t == null ? null : t - aWan); |
| | | aboveYoy.put(city, h2032FreightYoy.get(city)); |
| | | // è§ä¸åæ¯ = (è§ä¸ä»å¹´ - è§ä¸å»å¹´) / è§ä¸å»å¹´ï¼è§ä¸å»å¹´ = 模æ¿å»å¹´å计 - H2032å»å¹´è§ä¸ |
| | | Double tLast = lastFreightCum(ftMap.get(city), month); |
| | | Double aLast = h2032FreightCumLast.get(city); |
| | | double aLastWan = aLast == null ? 0.0 : round(aLast / 10000.0, 4); |
| | | Double belowLast = tLast == null ? null : round(tLast - aLastWan, 4); |
| | | double aLastWan = aLast == null ? 0.0 : aLast / 10000.0; |
| | | Double belowLast = tLast == null ? null : tLast - aLastWan; |
| | | Double b = below.get(city); |
| | | belowYoy.put(city, belowLast == null || belowLast == 0.0 || b == null |
| | | ? null : round((b - belowLast) / belowLast, 4)); |
| | | ? null : (b - belowLast) / belowLast); |
| | | totalYoy.put(city, freightCumYoy(ftMap.get(city), month)); |
| | | } |
| | | |
| | |
| | | if (maLast != null) provMonthAboveLast += maLast; |
| | | monthAbove.put(city, ma); |
| | | monthTotal.put(city, mt); |
| | | monthBelow.put(city, mt == null ? null : round(mt - (ma == null ? 0.0 : ma), 4)); |
| | | monthBelow.put(city, mt == null ? null : mt - (ma == null ? 0.0 : ma)); |
| | | monthAboveYoy.put(city, growthYoy(ma, maLast)); |
| | | Double mb = monthBelow.get(city); |
| | | Double mbLast = mtLast == null ? null : round(mtLast - (maLast == null ? 0.0 : maLast), 4); |
| | | Double mbLast = mtLast == null ? null : mtLast - (maLast == null ? 0.0 : maLast); |
| | | monthBelowYoy.put(city, growthYoy(mb, mbLast)); |
| | | monthTotalYoy.put(city, freightYoy(ftMap.get(city), month)); |
| | | } |
| | | Double provMonthAboveWan = provMonthAbove == 0.0 ? null : round(provMonthAbove, 4); |
| | | Double provMonthAboveWan = provMonthAbove == 0.0 ? null : provMonthAbove; |
| | | Double provMonthTotal = freightMonth(ftMap.get("æ¹åç"), month); |
| | | Double provMonthBelow = provMonthTotal == null ? null : round(provMonthTotal - provMonthAbove, 4); |
| | | Double provMonthBelow = provMonthTotal == null ? null : provMonthTotal - provMonthAbove; |
| | | Double provMonthAboveYoy = growthYoy(provMonthAbove == 0.0 ? null : provMonthAbove, provMonthAboveLast); |
| | | Double provMonthTotalLast = lastFreightMonth(ftMap.get("æ¹åç"), month); |
| | | Double provMonthBelowLast = provMonthTotalLast == null ? null |
| | | : round(provMonthTotalLast - provMonthAboveLast, 4); |
| | | : provMonthTotalLast - provMonthAboveLast; |
| | | Double provMonthBelowYoy = growthYoy(provMonthBelow, provMonthBelowLast); |
| | | Double provMonthTotalYoy = freightYoy(ftMap.get("æ¹åç"), month); |
| | | |
| | |
| | | private Double monthFreightWan(Map<String, Map<Integer, Double>> byCityMonth, String city, int month) { |
| | | Map<Integer, Double> byMonth = byCityMonth == null ? null : byCityMonth.get(city); |
| | | Double v = byMonth == null ? null : byMonth.get(month); |
| | | return v == null ? null : round(v / 10000.0, 4); |
| | | return v == null ? null : v / 10000.0; |
| | | } |
| | | |
| | | /** 忝 = (æ¬æ-åºæ)/åºæï¼ä»»ä¸æç¼ºå¤±æåºæä¸º 0 è¿å null */ |
| | |
| | | } |
| | | } |
| | | |
| | | /** å¨è½¬éæå Q/R å æ¯ï¼æ¨¡æ¿ä¸ºç¼åå¼ï¼ææ°æ°æ®éç®ï¼è§ä¸å æ¯ 1 ä½å°æ°ï¼ */ |
| | | /** å¨è½¬éæå Q/R å æ¯ï¼æ¨¡æ¿ä¸ºç¼åå¼ï¼ææ°æ°æ®éç®ï¼å
¨ç²¾åº¦åå
¥ï¼ä¸¤ä½å°æ°å±ç¤ºäº¤ç»åå
æ ¼æ ¼å¼ï¼ */ |
| | | private void setFreightShare(Row row, Double above, Double total) { |
| | | if (total != null && total > 0 && above != null) { |
| | | double share = round(above * 10.0 / total, 1); |
| | | double share = above * 10.0 / total; |
| | | setFreightCell(row, 16, share); |
| | | setFreightCell(row, 17, round(10.0 - share, 1)); |
| | | setFreightCell(row, 17, 10.0 - share); |
| | | } else { |
| | | setFreightCell(row, 16, (Double) null); |
| | | setFreightCell(row, 17, (Double) null); |
| | |
| | | setNumeric(row, 15, isProvince ? null : yoyRankOfMap(totalYoy, city)); |
| | | |
| | | if (t != null && t > 0 && a != null) { |
| | | double share = round(a * 10.0 / t, 1); |
| | | double share = a * 10.0 / t; |
| | | setNumeric(row, 16, share); |
| | | setNumeric(row, 17, round(10.0 - share, 1)); |
| | | setNumeric(row, 17, 10.0 - share); |
| | | } |
| | | return rowIdx + 1; |
| | | } |
| | |
| | | setNumeric(row, 15, isProvince || cum == null ? null : yoyRankOfTurnover(cumMap, city, 2)); |
| | | |
| | | if (total != null && total > 0 && above != null) { |
| | | double share = round(above * 10.0 / total, 1); |
| | | double share = above * 10.0 / total; |
| | | setNumeric(row, 16, share); |
| | | setNumeric(row, 17, round(10.0 - share, 1)); |
| | | setNumeric(row, 17, 10.0 - share); |
| | | } |
| | | return rowIdx + 1; |
| | | } |
| | |
| | | Double v = byMonth == null ? null : byMonth.get(month); |
| | | if (v != null) sum += v; |
| | | } |
| | | return round(sum / 10000.0, 4); |
| | | return sum / 10000.0; |
| | | } |
| | | Double total = freightMonth(ft, month); |
| | | Double above = getProvinceMonthValue(provinceMonthMap, ft, month, "freight", "above", h2032Freight); |
| | |
| | | for (Double v : h2032FreightCum.values()) { |
| | | if (v != null) sum += v; |
| | | } |
| | | return round(sum / 10000.0, 4); |
| | | return sum / 10000.0; |
| | | } |
| | | Double total = freightCum(ft, monthCount); |
| | | Double above = getProvinceCumValue(provinceCum, ft, "freight", "above", h2032FreightCum, monthCount); |
| | |
| | | if ("above".equals(scale)) { |
| | | Map<Integer, Double> byMonth = h2032Freight.get(city); |
| | | Double v = byMonth == null ? null : byMonth.get(month); |
| | | return v == null ? 0.0 : round(v / 10000.0, 4); |
| | | return v == null ? 0.0 : v / 10000.0; |
| | | } |
| | | Double total = freightMonth(ft, month); |
| | | Double above = getCityMonthValue(monthData, ft, city, month, "freight", "above", h2032Freight); |
| | |
| | | if ("total".equals(scale)) return freightCum(ft, monthCount); |
| | | if ("above".equals(scale)) { |
| | | Double v = h2032FreightCum.get(city); |
| | | return v == null ? 0.0 : round(v / 10000.0, 4); |
| | | return v == null ? 0.0 : v / 10000.0; |
| | | } |
| | | Double total = freightCum(ft, monthCount); |
| | | Double above = getCityCumValue(cum, ft, "freight", "above", h2032FreightCum, city, monthCount); |
| | |
| | | double v = passengerMonthVal(data, indi, currentYear, m, region, metricIdx); |
| | | if (!keepFormula) { |
| | | if (c == null) c = row.createCell(col); |
| | | if (v == 0.0) c.setBlank(); else c.setCellValue(round(v, 4)); |
| | | if (v == 0.0) c.setBlank(); else c.setCellValue(v); |
| | | } |
| | | // 忝åï¼åºå
å»å¹´åæåæ¯ï¼æ¨¡æ¿ #REF! å
¬å¼æ¿æ¢ä¸ºæ°å¼ï¼å
¬å¼è¡ä¹è¦åï¼ |
| | | double lv = passengerMonthVal(data, indi, currentYear - 1, m, region, metricIdx); |
| | | Cell yc = row.getCell(col + 1); |
| | | if (yc == null) yc = row.createCell(col + 1); |
| | | if (v == 0.0 || lv == 0.0) yc.setBlank(); else yc.setCellValue(round((v - lv) / lv, 4)); |
| | | if (v == 0.0 || lv == 0.0) yc.setBlank(); else yc.setCellValue((v - lv) / lv); |
| | | } |
| | | // ç´¯è®¡åæ¯åï¼æ¨¡æ¿ #REF! â åºå
å»å¹´ 1..N æç´¯è®¡åæ¯æ°å¼ï¼ |
| | | int cumCol = extended ? 26 : 14; |
| | | Double cumYoy = passengerCumYoy(data, indi, currentYear, fillMonths, region, metricIdx); |
| | | Cell yc2 = row.getCell(cumCol + 1); |
| | | if (yc2 == null) yc2 = row.createCell(cumCol + 1); |
| | | if (cumYoy == null) yc2.setBlank(); else yc2.setCellValue(round(cumYoy, 4)); |
| | | if (cumYoy == null) yc2.setBlank(); else yc2.setCellValue(cumYoy); |
| | | } |
| | | recalc(wb); |
| | | return toBytes(wb); |
| | |
| | | |
| | | private Double yoy(Double cur, Double base) { |
| | | if (cur == null || base == null || base == 0.0) return null; |
| | | return round((cur - base) / base, 4); |
| | | return (cur - base) / base; |
| | | } |
| | | |
| | | /** ææ åå¼ï¼å·²æ¢ç®ä¸ºä¸äºº/ä¸äººå
¬é/å
¬éï¼æ æ°æ®è¿å nullï¼ */ |
| | |
| | | if (v == 0.0) return; // åºå
æ æºï¼ä¿çæ¯ç/å®ç¨¿åå¼ï¼ç¼ºæ°æ®ä¸è¦ç |
| | | // POI setCellValue(double) 对å
¬å¼åå
æ ¼åªæ´æ°ç¼åä¸ç§»é¤å
¬å¼ï¼å¿
é¡»å
setBlank ååå¼ |
| | | c.setBlank(); |
| | | c.setCellValue(round(v, 4)); |
| | | c.setCellValue(v); |
| | | } |
| | | |
| | | /** æ¾å¼åå
¥ 0ï¼POI setCellValue(0.0) ä¼è½¬ blankï¼éæä½åºå± XMLï¼ */ |
| | |
| | | int monthCount = (y == currentYear) ? maxMonth : 12; |
| | | for (int m = 1; m <= monthCount; m++) { |
| | | Double cur = midMetricValue(aggOf(data, y, m, region), i, volume); |
| | | setNumeric(row, col++, cur == null ? null : round(cur, 4)); |
| | | setNumeric(row, col++, cur); |
| | | Double base = midMetricValue(aggOf(data, y - 1, m, region), i, volume); |
| | | setNumeric(row, col++, yoy(cur, base)); |
| | | } |
| | | Double cum = midCumOf(data, y, region, monthCount, i, volume); |
| | | setNumeric(row, col++, cum == null ? null : round(cum, 4)); |
| | | setNumeric(row, col++, cum); |
| | | Double cumBase = midCumOf(data, y - 1, region, monthCount, i, volume); |
| | | setNumeric(row, col++, yoy(cum, cumBase)); |
| | | } |
| | |
| | | double turn = midCumClass(mid, currentYear, city, maxMonth, 0, false); |
| | | double lastPass = midCumClass(mid, currentYear - 1, city, maxMonth, 0, true); |
| | | double lastTurn = midCumClass(mid, currentYear - 1, city, maxMonth, 0, false); |
| | | setValOrBlank(sheet, r0, 1, pass == 0 ? null : round(pass, 4)); |
| | | setValOrBlank(sheet, r0, 1, pass == 0 ? null : pass); |
| | | setValOrBlank(sheet, r0, 3, midCumYoy(mid, currentYear, city, maxMonth, 0, true)); |
| | | setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4)); |
| | | setValOrBlank(sheet, r0, 5, turn == 0 ? null : turn); |
| | | setValOrBlank(sheet, r0, 7, midCumYoy(mid, currentYear, city, maxMonth, 0, false)); |
| | | // å³å彿ï¼L/P å¼ãN/R 彿忝ï¼M/O/Q/S æåå
¬å¼ä¿çï¼ |
| | | double mPass = midClassVal(mid, currentYear, maxMonth, city, 0, true); |
| | | double mTurn = midClassVal(mid, currentYear, maxMonth, city, 0, false); |
| | | double mLastPass = midClassVal(mid, currentYear - 1, maxMonth, city, 0, true); |
| | | double mLastTurn = midClassVal(mid, currentYear - 1, maxMonth, city, 0, false); |
| | | setValOrBlank(sheet, r0, 11, mPass == 0 ? null : round(mPass, 4)); |
| | | setValOrBlank(sheet, r0, 11, mPass == 0 ? null : mPass); |
| | | setValOrBlank(sheet, r0, 13, mPass == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, city, 0, true)); |
| | | setValOrBlank(sheet, r0, 15, mTurn == 0 ? null : round(mTurn, 4)); |
| | | setValOrBlank(sheet, r0, 15, mTurn == 0 ? null : mTurn); |
| | | setValOrBlank(sheet, r0, 17, mTurn == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, city, 0, false)); |
| | | } |
| | | recalc(wb); |
| | |
| | | |
| | | private Double yoyOf(double cur, double base) { |
| | | if (base == 0.0) return null; |
| | | return round((cur - base) / base, 4); |
| | | return (cur - base) / base; |
| | | } |
| | | |
| | | /** ä¸å£å¾å类累计ï¼1..monthCount ææ±åï¼ */ |
| | |
| | | double turn = midCumClass(mid, currentYear, "æ¹åç", maxMonth, dims[i], false); |
| | | double lastPass = midCumClass(mid, currentYear - 1, "æ¹åç", maxMonth, dims[i], true); |
| | | double lastTurn = midCumClass(mid, currentYear - 1, "æ¹åç", maxMonth, dims[i], false); |
| | | setValOrBlank(sheet, r0, 1, pass == 0 ? null : round(pass, 4)); |
| | | setValOrBlank(sheet, r0, 1, pass == 0 ? null : pass); |
| | | setValOrBlank(sheet, r0, 2, midCumYoy(mid, currentYear, "æ¹åç", maxMonth, dims[i], true)); |
| | | setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4)); |
| | | setValOrBlank(sheet, r0, 5, turn == 0 ? null : turn); |
| | | setValOrBlank(sheet, r0, 6, midCumYoy(mid, currentYear, "æ¹åç", maxMonth, dims[i], false)); |
| | | } |
| | | // ä¸ååï¼å½æï¼ï¼æ é¢è¡9ãæ°æ®è¡11-15ï¼0-based 8ã10-14ï¼ |
| | |
| | | double turn = midClassVal(mid, currentYear, maxMonth, "æ¹åç", dims[i], false); |
| | | double lastPass = midClassVal(mid, currentYear - 1, maxMonth, "æ¹åç", dims[i], true); |
| | | double lastTurn = midClassVal(mid, currentYear - 1, maxMonth, "æ¹åç", dims[i], false); |
| | | setValOrBlank(sheet, r0, 1, pass == 0 ? null : round(pass, 4)); |
| | | setValOrBlank(sheet, r0, 1, pass == 0 ? null : pass); |
| | | setValOrBlank(sheet, r0, 2, pass == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, "æ¹åç", dims[i], true)); |
| | | setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4)); |
| | | setValOrBlank(sheet, r0, 5, turn == 0 ? null : turn); |
| | | setValOrBlank(sheet, r0, 6, turn == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, "æ¹åç", dims[i], false)); |
| | | } |
| | | // ä¸ååå æ¯å
¬å¼ç±æ ·ä¾æåä¸ååï¼B$3/F$3ï¼ï¼æ¹å为æ¬åæ»è¡ï¼B$11/F$11ï¼ï¼è¡12-15 |
| | |
| | | Cell c = row.getCell(colIdx); |
| | | if (c != null && c.getCellType() == org.apache.poi.ss.usermodel.CellType.FORMULA) return; |
| | | if (c == null) c = row.createCell(colIdx); |
| | | if (v == 0) c.setBlank(); else c.setCellValue(round(v, 2)); |
| | | if (v == 0) c.setBlank(); else c.setCellValue(v); |
| | | } |
| | | |
| | | /** æ¾å¼åå
¥ 0ï¼setDataCell 对 0 ç½®ç©ºï¼æ±æ»è¡¨ç½çº¦è½¦è¡éè¦æ¾ç¤º 0ï¼ */ |
| | |
| | | if (r.getAvgDistanceCity() != null && r.getAvgDistanceCity() > 0) a[5] = r.getAvgDistanceCity(); |
| | | } |
| | | for (double[] a : map.values()) { |
| | | if (a[4] <= 0 && a[0] > 0) a[4] = round(a[1] / a[0], 2); |
| | | if (a[5] <= 0 && a[2] > 0) a[5] = round(a[3] / a[2], 2); |
| | | if (a[4] <= 0 && a[0] > 0) a[4] = a[1] / a[0]; |
| | | if (a[5] <= 0 && a[2] > 0) a[5] = a[3] / a[2]; |
| | | } |
| | | return map; |
| | | } |
| | |
| | | Row row = sheet.getRow(rowIdx); |
| | | if (row == null) row = sheet.createRow(rowIdx); |
| | | if (a > 0) { |
| | | // 2026å¹´ 1..N æï¼åºå
æå¼åå¡«ï¼2ä½å°æ°ï¼ï¼æ 弿¸
ç©ºæ¨¡æ¿æ ·ä¾ |
| | | // 2026å¹´ 1..N æï¼åºå
æå¼åå¡«ï¼å
¨ç²¾åº¦åå
¥ï¼ä¸¤ä½å°æ°ç±åå
æ ¼æ ¼å¼å±ç¤ºï¼ï¼æ 弿¸
ç©ºæ¨¡æ¿æ ·ä¾ |
| | | for (int m = 1; m <= month; m++) { |
| | | double v = cityVal(monthCity, area, m, k); |
| | | Cell c = row.getCell(2 + (m - 1) * 2); |
| | | if (c == null) c = row.createCell(2 + (m - 1) * 2); |
| | | if (v == 0) c.setBlank(); else c.setCellValue(round(v, 2)); |
| | | if (v == 0) c.setBlank(); else c.setCellValue(v); |
| | | } |
| | | // 2025å¹´ 1..12 æï¼åºå
æå»å¹´æ°æ®åå¡«ï¼å¦åæ¸
ç©ºæ¨¡æ¿æ ·ä¾ |
| | | for (int m = 1; m <= 12; m++) { |
| | | double v = cityVal(lastYearMonthCity, area, m, k); |
| | | Cell c = row.getCell(19 + (m - 1) * 2); |
| | | if (c == null) c = row.createCell(19 + (m - 1) * 2); |
| | | if (v == 0) c.setBlank(); else c.setCellValue(round(v, 2)); |
| | | if (v == 0) c.setBlank(); else c.setCellValue(v); |
| | | } |
| | | } |
| | | rowIdx++; |
| | |
| | | hssfNum(row, 8, agg.startCum == 0 ? null : agg.startCum); |
| | | hssfNum(row, 9, agg.yearPlan == 0 ? null : agg.yearPlan); |
| | | hssfNum(row, 22, agg.yearCum == 0 ? null : agg.yearCum); |
| | | if (agg.yearPlan > 0) hssfNum(row, 23, round(agg.yearCum / agg.yearPlan, 4)); |
| | | if (agg.yearPlan > 0) hssfNum(row, 23, agg.yearCum / agg.yearPlan); |
| | | } |
| | | |
| | | |
| | |
| | | putNum(row, 2, s[3] == 0 ? null : s[3]); |
| | | putNum(row, 3, s[4] == 0 ? null : s[4]); |
| | | double b = numOf(row.getCell(1)); |
| | | putNum(row, 4, b > 0 ? round(s[3] / b * 100, 4) : null); |
| | | putNum(row, 4, b > 0 ? s[3] / b * 100 : null); |
| | | cT += s[3]; |
| | | dT += s[4]; |
| | | } |
| | |
| | | putNum(tot, 2, cT == 0 ? null : cT); |
| | | putNum(tot, 3, dT == 0 ? null : dT); |
| | | double b = numOf(tot.getCell(1)); |
| | | putNum(tot, 4, b > 0 ? round(cT / b * 100, 4) : null); |
| | | putNum(tot, 4, b > 0 ? cT / b * 100 : null); |
| | | } |
| | | } |
| | | try { |
| | |
| | | for (InvestmentMonthly m : monthlies) provinceYearPlan += nz(m.getYearPlan()); |
| | | HSSFRow rowOther = s1.getRow(9); |
| | | for (int c = 1; c <= 5; c++) hssfNum(rowOther, c, null); |
| | | hssfNum(rowOther, 5, provinceYearPlan == 0 ? null : round(provinceYearPlan / 10000, 2)); |
| | | hssfNum(rowOther, 5, provinceYearPlan == 0 ? null : provinceYearPlan / 10000); |
| | | // ---- sheet2 è§ä¸é¡¹ç®è¡¨ï¼è¡¨å¤´å¹´ä»½ + å计 + 项ç®è¡ ---- |
| | | HSSFSheet s2 = wb.getSheetAt(1); |
| | | hssfText(s2.getRow(0), 0, year + "年交é建设项ç®å¨å¤æ
åµï¼è§æ¨¡ä»¥ä¸é¡¹ç®ï¼"); |
| | |
| | | private double nz(Double v) { |
| | | return v == null ? 0.0 : v; |
| | | } |
| | | /** æ°å¼æ ¼å¼é 3 ä½å以ä¸çå°æ°é¨åï¼å¦ 0.0000 / 0.000_ ï¼ */ |
| | | private static final java.util.regex.Pattern DEC_MORE_THAN_TWO = java.util.regex.Pattern.compile("\\.0{3,}"); |
| | | /** çæè¡¨æ°å¼åç»ä¸æ ·å¼ï¼ä¿çå
¨ç²¾åº¦æ°å¼ï¼æ¾ç¤ºä¸¤ä½å°æ°ï¼æ´æ°å¼ä¸ %/æ¥æ/ç§å¦è®¡æ°çæ¢ææ ·å¼ä¸æ¹å */ |
| | | private void applyTwoDecimalFormat(org.apache.poi.ss.usermodel.Workbook wb) { |
| | | if (wb == null) return; |
| | |
| | | CellType ct = cell.getCellType(); |
| | | if (ct != CellType.NUMERIC && ct != CellType.FORMULA) continue; |
| | | if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) continue; |
| | | boolean integral = false; |
| | | if (ct == CellType.NUMERIC) { |
| | | integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue(); |
| | | } else if (cell.getCachedFormulaResultType() == CellType.NUMERIC) { |
| | | integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue(); |
| | | } |
| | | if (integral) continue; // æ´æ°ä¸æ¾ç¤º .00ï¼å«å
¬å¼ç»æä¸ºæ´æ°çæ ¼ï¼ |
| | | org.apache.poi.ss.usermodel.CellStyle cs = cell.getCellStyle(); |
| | | if (cs == null) continue; |
| | | String f = cs.getDataFormatString(); |
| | | if (f == null) f = ""; |
| | | if (f.contains("%") || f.contains("E") || f.contains("0.00")) continue; |
| | | boolean plain = f.isEmpty() || "General".equals(f) || "general".equals(f) |
| | | || "0".equals(f) || "#,##0".equals(f) || "0.0".equals(f) || "#,##0.0".equals(f); |
| | | if (!plain) continue; |
| | | if (f.contains("%") || f.contains("E") || f.contains("@")) continue; |
| | | String normalized = null; |
| | | if (DEC_MORE_THAN_TWO.matcher(f).find()) { |
| | | // æ¯çä¸ªå«æ ¼å¸¦ 3~4 ä½å°æ°æ ¼å¼ï¼å¦ 0.000_ ã0.0000_);[Red]\(0.0000\)ï¼ï¼æ°å¼ä»å
¨ç²¾åº¦ï¼ |
| | | // å±ç¤ºç»ä¸æ¶æå°ä¸¤ä½ãè¿ç±»æ ¼æ¬å°±ææ°å¼æ ¼å¼å±ç¤ºï¼æ
ä¸åãæ´æ°ä¸æ¾ç¤º .00ãä¿æ¤å½±åã |
| | | normalized = DEC_MORE_THAN_TWO.matcher(f).replaceAll(".00"); |
| | | } else { |
| | | boolean integral = false; |
| | | if (ct == CellType.NUMERIC) { |
| | | integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue(); |
| | | } else if (cell.getCachedFormulaResultType() == CellType.NUMERIC) { |
| | | integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue(); |
| | | } |
| | | if (integral) continue; // æ´æ°ä¸æ¾ç¤º .00ï¼å«å
¬å¼ç»æä¸ºæ´æ°çæ ¼ï¼ |
| | | if (f.contains("0.00")) continue; |
| | | boolean plain = f.isEmpty() || "General".equals(f) || "general".equals(f) |
| | | || "0".equals(f) || "#,##0".equals(f) || "0.0".equals(f) || "#,##0.0".equals(f); |
| | | if (!plain) continue; |
| | | } |
| | | org.apache.poi.ss.usermodel.CellStyle ns = wb.createCellStyle(); |
| | | ns.cloneStyleFrom(cs); |
| | | ns.setDataFormat(fmtTwo); |
| | | ns.setDataFormat(normalized == null ? fmtTwo : df.getFormat(normalized)); |
| | | cell.setCellStyle(ns); |
| | | } catch (Exception ignore) { |
| | | // 个å«åå
æ ¼æ ¼å¼å¼å¸¸ä¸é»å¡å¯¼åº |