jquick-pdf 区域分布报表实战:一份 21 行明细表的版式解剖与地图嵌入
官网示例:
- FORMULAS 示例页:https://www.jquick.org/jquick-pdf/demo/18_region_geo/
- github 地址:https://github.com/paohaijiao/jquick-pdf
摘要(meta description):省公共信用信息平台的区域均衡分析材料,主体是一张 21 行的市州明细表,配一张四川省行政区划底图和五段分析结论。这类报表的成败在版式:表怎么画才不散、地图给多宽才不糊、分析区用什么形式才不像附录。本文以模板文件为主线逐块解剖,Java 侧的 GeoJSON 读取与地图渲染放在末尾作注脚(jquick-pdfx 4.7.0+,Apache-2.0)。
标签:jquick-pdf、Java PDF、报表开发、地图报表
以下为上述代码 + 模板真实运行生成的 PDF 首屏预览(由 jquick-pdf 渲染输出,非示意图):

翻开模板,第一眼是抬头那三栏
这份模板我先看的不是图,是抬头。80 多行里开场只有 16 行,但信息层次排得很清楚:
<div style="borderBottom:2px solid #1F4E79; paddingBottom:8px; marginBottom:10px; keepTogether:true">
<div style="display:flex; justifyContent:space-between">
<div style="width:150px">…省公共信用信息平台…</div>
<div style="width:250px; textAlignment:center">…区域业务受理量分布…</div>
<div style="width:150px; textAlignment:right">…2025年1月15日…</div>
</div>
</div>
三栏定宽:左 150、中 250、右 150,加起来 550,剩下的宽度被 space-between 均分成两道缝。左边的平台名是 10pt 深蓝加粗,中间主标题 16pt 深蓝加粗居中,右边日期 9pt 灰色右对齐。左中右三个位置的眼位分别是"谁出的""叫什么""什么时候",从左往右读一遍,落款信息就齐了。省掉"报送对象""密级"这些格子,抬头只有一行。
抬头底下不是色块,是一根 borderBottom:2px 的深蓝线,paddingBottom:8px 让文字和线之间留出呼吸,marginBottom:10px 把它和正文隔开。整份文档的主色 #1F4E79 就在这一根线上定了调,后面所有的章节标题、卡片左肩线都从它来。(效果预览图 alt:jquick-pdf 生成的四川区域业务分布 PDF,三栏抬头、21 行浅线明细表、深蓝色行政区划地图、五张浅蓝分析卡片)
keepTogether:true 抬头和章节块上都有,作用是防止这一块被分页切开,避免第二页顶上出现半个标题。
一级标题是「下划线式」,不是色块
三个一级标题写法完全一致:
<h2 style="color:#1F4E79; fontSize:13pt; bold:true; borderBottom:1px solid #1F4E79; paddingBottom:3px; marginBottom:8px">'一、各市(州)业务受理量明细'</h2>
13pt 深蓝加粗,底下压一根 1px 同色线,paddingBottom:3px 贴着字底。这是老派公文和研报里最常见的章节分隔方式:不加底色、不加圆角、不加图标,一条线就是全部装饰。好处是页面干净,21 行表格加一张地图已经很满,标题再搞得花哨,整页会显得吵。
编号用中文数字加顿号,三处顺序是明细、地图、分析,也就是"先看数、再看位置、后看结论":数字给精确值,地图给空间直觉,分析给判断。
paddingBottom:3px 这个值调过:给到 6px 线离字太远,标题像浮在空中;给到 0 线贴着字脚,13pt 的中文字下缘会压到线。
明细表:表头用 td,竖线一根不画
21 行加合计行的表,最容易出的问题不是数据错,是"看起来像 Excel"。
<tr>
<td style="width:200px; bold:true; padding:6px 4px; borderBottom:1px solid #E3E8EE">'地区'</td>
<td style="width:130px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'受理量(件)'</td>
<td style="width:110px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'同比增长'</td>
<td style="width:120px; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'全省占比'</td>
</tr>
表头没有用 th,用的是 td 加 bold:true;没有底色,只有一条底线;四列宽度 200 / 130 / 110 / 120 加起来 560,正好等于表格的 width:560px。全表不画一根竖线,也没有外框,靠每行一条 1px 的 #E3E8EE 浅灰线把 21 行数据和合计行串起来。
这种"横线表"对长表格特别合适。21 个市州竖着排,每格都画边框就是八十多个格子的网格,眼睛会在格子里跳;只留横线,每行像一条记录,视线顺着左列往下滑,找"成都市""甘孜州"快得多。
四个列宽也不是随手给的。地区列 200px 是给自治州名字留的——"阿坝藏族羌族自治州"九个字,9pt 字号要差不多 100pt 才排得下,200px 富余但不会浪费太多,因为其他三列都是数字,宽度需求稳定。三个数字列里受理量最宽(千分位五位数,42,180),占比最窄(23.8% 这种格式最多五个字符)。
对齐是统一的:文字列左对齐,三个数字列全部 textAlign:right。右对齐之后各位数字在竖直方向对齐,扫一眼能比出量级;左对齐的话 42,180 和 2,410 首位对不齐,就没有可比性了。表头也跟着右对齐。
同比增长那一列没有加正号,写的就是 6.2%、11.8%。21 个市州全部正增长,加号满天飞反而噪音,模板的处理是把"全部为正"这个前提交给下面分析区的文字去交代。
合计行与那根 2px 底线
<td style="padding:6px 4px; bold:true; borderBottom:2px solid #1F4E79">'全省合计(21个市州)'</td>
合计行没有反白底色,也没有灰底,就是四格加粗字,最后一根横线从 1px 换成 2px 深蓝。这一根线的分量比它看起来大:21 行细线已经把眼睛带到了表尾,最后一根 2px 的深线相当于句号,读者的视线到这儿自动停住,不会继续往下滑到地图标题上。
第一格的文案写的是"全省合计(21个市州)",把口径直接写在标签里。区域报表常见的争议是"这个合计含不含省本级""21 个还是 20 个",标签里写清楚,比在页脚加注释有效得多。
我把 21 个市的受理量加了一遍:42,180 + 14,260 + 12,840 + 11,520 + 10,360 + 9,180 + 8,940 + 8,120 + 7,860 + 6,540 + 5,920 + 5,680 + 5,240 + 4,860 + 4,320 + 3,980 + 3,760 + 3,520 + 3,240 + 2,860 + 2,410,结果 177,590,和合计行一字不差。成都 42,180 ÷ 177,590 等于 23.75%,表里写 23.8%,四舍五入对得上。
地图区只声明宽度
<div style="display:flex; justifyContent:center">
<svg style="width:700pt">${svg}</svg>
</div>
<p style="fontSize:9pt; color:#6c757d; italic:true; marginTop:6px">'图 1 四川省21个市(州)业务受理量分布(底图:四川省行政区划)'</p>
<svg> 只有 width,没有 height。这是这份模板最值得学的一手:渲染器按 800×600 的画布画地图,模板只把宽度压到 700pt,高度按原比例跟着缩到 525pt 左右,轮廓不会变形。要是宽高都写死,700×400 这种比例会把四川的版图横向拉扁——地图被拉扁比任何排版问题都刺眼,因为读者对省界形状有肌肉记忆。
700pt 这个宽度也是算过的。正文版心 560px 的表,地图给到 700pt(差不多 933px),图比表宽出一截,视觉上成为页面的重心;地图再窄,21 个市州的相对位置就分不清了,甘孜、阿坝那种大块区域会被压成一片深蓝。外面套一层 justifyContent:center 的 flex 容器让整块图水平居中,左右留白对称。
图注一行 9pt 斜体灰色,一句话交代"图 1 + 内容 + 底图来源"。斜体是弱化处理,读图时不会先读注,要找口径时又一眼能看见。
分析区:五张卡片,没有圆点
<list style="listStyleType:none; paddingLeft:0px; fontSize:10pt">
<li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79">
<span style="bold:true; color:#1F4E79">'成都平原经济区领跑:'</span>'成都市受理 42,180 件、占全省 23.8%…'
</li>
</list>
listStyleType:none 把项目符号关掉,paddingLeft:0 把列表默认缩进去掉,每个 li 换成一块 #E8F0F7 浅蓝底、左边 3px 深蓝肩线的卡片,卡片之间 6px 间距。五条结论就是五张卡片,竖着摞下来。
这个改法解决了一个具体问题:分析区如果还是普通项目符号列表,读起来像附录,读者会跳过。换成卡片之后,每条结论成了一个独立的信息块,底色加肩线自带边界,bold 加 #1F4E79 的前缀"成都平原经济区领跑:"在每块里先立一个判断,后面跟数据和解释。五条分别是领跑、增速、尾部、分化、建议,判断在前、依据在后,这是分析文字该有的顺序。
五条全部同底色同肩线,没有一条被特意加重,连"建议"那条也是。结论区五条并列,谁都不该比谁更响,要突出建议得在文字里下功夫。
卡片之间的 6px 不能省。3px 试过,五块浅蓝几乎连成一片,肩线看着像一根断断续续的长线;10px 又散,五块各说各话。
页脚一行灰字
<lineSeparator style="strokeColor:#DCE3EC"></lineSeparator>
<p style="color:#6c757d; fontSize:8pt; marginTop:8px">'数据来源:省公共信用信息平台 | 统计口径:2024年1月 - 12月 | 生成时间:2025年1月15日'</p>
先一根浅灰分隔线,再一行 8pt 灰字,三段信息用竖线隔开:谁给的数、什么口径、什么时候生成。
统计口径写的是"2024年1月 - 12月",抬头日期 2025 年 1 月 15 日,同比拿 2024 对 2023。数据周期、生成时间、同比基期三个时间概念各在各的位置,谁都不含混。
Java 侧三个注脚
版式讲完,回过头补三处代码上的事。
第一处是地图的数据来源。GeoOption.setGeoJsonContent() 吃的是一个 GeoJSON 字符串,Demo 里用 readFromClasspath("sample/test.geojson") 从 classpath 读,读取方法自己写了个私有工具,Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName) 拿流再用 UTF-8 逐行拼。
这个工具方法里有个顺序问题:try 的资源列表里先建了 InputStreamReader(is, UTF_8),is == null 的判断写在后面。真找不到文件的时候,先炸的是包装流那一行,抛出来的是空指针,自定义的那句 File not found in classpath 根本轮不到执行。我在自己项目里换成了先判空再包装,报错信息才有用。
第二处是枚举名。JChartType.Geo 是首字母大写、后面小写,和常见的全大写枚举风格不一致,照着 LINE、BAR 那样写 GEO 会编不过。这类地方别凭记忆写,从 Demo 里复制最稳。
第三处是配置挂载。地图的配置不在 JOption 的通用字段上,得先建 GeoOption,setBackgroundColor("#1F4E79") 定填充色——和模板主色同一个色号,图和页面才是一套——再 option.setGeoOption(geoOption) 挂上去,然后 renderChart(JChartType.Geo, option)。
PDF 那一段和所有 Demo 一样:setFlexLayout(true)、bind("svg", svg)、executeResource("report/biz/18_region_geo.txt")、写字节到 D:\test\biz\18_region_geo.pdf。这份模板里 flex 出现在两处,抬头三栏和地图容器,开关不打开,抬头会从三栏塌成一栏。
复现清单
- 依赖
io.github.paohaijiao:jquick-pdfx:4.7.0+(Apache-2.0 协议); - 准备 GeoJSON 底图放 classpath(Demo 用
sample/test.geojson),写一个按 UTF-8 读取的私有方法; new GeoOption(),setGeoJsonContent(...)灌底图,setBackgroundColor("#1F4E79")定填充色;new JOption()后setGeoOption(geoOption),renderChart(JChartType.Geo, option)取 SVG;JPdfConfig开setFlexLayout(true),构造JQuickPdfFactory后bind("svg", svg);executeResource("report/biz/18_region_geo.txt")执行模板,写D:\test\biz\18_region_geo.pdf;- 核对 21 个市州受理量合计 177,590 与合计行一致;
- 检查地图
<svg>是否只声明width:700pt,高度交给比例缩放。
完整源码附录
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Copyright (c) [2025-2099] Martin (goudingcheng@gmail.com)
*/
package com.github.paohaijiao.biz.chart;
import com.github.paohaijiao.JOption;
import com.github.paohaijiao.config.JPdfConfig;
import com.github.paohaijiao.demo.constant.JQuickConstant;
import com.github.paohaijiao.enums.JChartType;
import com.github.paohaijiao.executor.JQuickPdfFactory;
import com.github.paohaijiao.factory.JChartRendererFactory;
import com.github.paohaijiao.geo.GeoOption;
import org.junit.Test;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* 业务场景 Demo 18:区域业务分布表(政务/信用平台)
*
* <p>业务场景:省公共信用信息平台按行政区划汇总业务受理量,用于省社会信用体系建设联席会议的区域均衡分析。</p>
* <p>实际图表类型:{@link JChartType#Geo} 地图(GeoJSON 行政区划图,底图区域为四川省 21 个市/州)。</p>
*
* <p>模板:{@code report/biz/18_region_geo.txt};地图以 SVG 文本形式绑定到模板的 {@code ${svg}} 占位符,
* 输出到 {@code D:\test\biz\18_region_geo.pdf}。</p>
*
* <p>图表尺寸说明:地图按渲染器默认画布 800pt × 600pt(宽 × 高)绘制;模板中 {@code <svg>} 只声明宽度、
* 不声明高度,宽度被页面自动收窄时高度会按原比例同步缩放,不会纵向拉伸变形。</p>
*
* @author Martin
* @version 1.0.0
*/
public class JQuickBiz18RegionGeoTest {
public static final String path = JQuickConstant.path;
/**
* 从 classpath 读取文本内容(GeoJSON 底图)
*/
private String readFromClasspath(String fileName) throws IOException {
StringBuilder content = new StringBuilder();
try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
if (is == null) {
throw new IOException("File not found in classpath: " + fileName);
}
String line;
while ((line = br.readLine()) != null) {
content.append(line).append("\n");
}
}
return content.toString();
}
@Test
public void biz18RegionGeo() throws IOException {
JOption option = new JOption();
GeoOption geoOption = new GeoOption();
// 读取 classpath 下的四川省行政区划 GeoJSON(21 个市/州)作为底图
geoOption.setGeoJsonContent(readFromClasspath("sample/test.geojson"));
// 地图填充色沿用政务系统低饱和主色(深蓝)
geoOption.setBackgroundColor("#1F4E79");
option.setGeoOption(geoOption);
String svg = JChartRendererFactory.renderChart(JChartType.Geo, option);
File dir = new File(path + "biz");
if (!dir.exists()) {
dir.mkdirs();
}
FileOutputStream fileOutputStream = new FileOutputStream(path + "biz/18_region_geo.pdf");
JPdfConfig config = new JPdfConfig();
// 开启 flex 行布局,使模板中的 display:flex 生效(图表居中)
config.getLayoutConfig().setFlexLayout(true);
JQuickPdfFactory factory = new JQuickPdfFactory(config);
factory.bind("svg", svg);
byte[] bytes = factory.executeResource("report/biz/18_region_geo.txt");
fileOutputStream.write(bytes);
fileOutputStream.close();
}
}
<pdf>
<body>
<div style="borderBottom:2px solid #1F4E79; paddingBottom:8px; marginBottom:10px; keepTogether:true">
<div style="display:flex; justifyContent:space-between">
<div style="width:150px">
<p style="color:#1F4E79; fontSize:10pt; bold:true">'省公共信用信息平台'</p>
</div>
<div style="width:250px; textAlignment:center">
<h1 style="color:#1F4E79; fontSize:16pt; bold:true; textAlignment:center">'区域业务受理量分布'</h1>
</div>
<div style="width:150px; textAlignment:right">
<p style="color:#6c757d; fontSize:9pt">'2025年1月15日'</p>
</div>
</div>
</div>
<div style="marginBottom:10px">
<h2 style="color:#1F4E79; fontSize:13pt; bold:true; borderBottom:1px solid #1F4E79; paddingBottom:3px; marginBottom:8px">'一、各市(州)业务受理量明细'</h2>
<table style="width:560px; fontSize:9pt">
<tr>
<td style="width:200px; bold:true; padding:6px 4px; borderBottom:1px solid #E3E8EE">'地区'</td>
<td style="width:130px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'受理量(件)'</td>
<td style="width:110px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'同比增长'</td>
<td style="width:120px; bold:true; padding:6px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'全省占比'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'成都市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'42,180'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6.2%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'23.8%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'绵阳市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'14,260'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'9.4%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8.0%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'宜宾市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'12,840'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'11.8%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7.2%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'南充市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'11,520'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7.6%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6.5%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'泸州市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'10,360'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8.9%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.8%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'凉山彝族自治州'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'9,180'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'12.6%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.2%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'达州市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8,940'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6.8%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.0%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'乐山市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8,120'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.4%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4.6%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'德阳市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7,860'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8.2%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4.4%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'眉山市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6,540'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'10.6%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.7%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'遂宁市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5,920'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7.2%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.3%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'内江市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5,680'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5.9%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.2%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'自贡市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'5,240'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4.8%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.0%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'广元市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4,860'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'9.1%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.7%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'巴中市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'4,320'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'11.2%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.4%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'雅安市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3,980'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'8.6%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.2%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'资阳市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3,760'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'6.4%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.1%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'广安市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3,520'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'7.8%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2.0%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'攀枝花市'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3,240'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'3.6%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'1.8%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'甘孜藏族自治州'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2,860'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'15.8%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'1.6%'</td>
</tr>
<tr>
<td style="padding:5px 4px; borderBottom:1px solid #E3E8EE">'阿坝藏族羌族自治州'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'2,410'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'14.2%'</td>
<td style="padding:5px 4px; textAlign:right; borderBottom:1px solid #E3E8EE">'1.4%'</td>
</tr>
<tr>
<td style="padding:6px 4px; bold:true; borderBottom:2px solid #1F4E79">'全省合计(21个市州)'</td>
<td style="padding:6px 4px; textAlign:right; bold:true; borderBottom:2px solid #1F4E79">'177,590'</td>
<td style="padding:6px 4px; textAlign:right; bold:true; borderBottom:2px solid #1F4E79">'7.5%'</td>
<td style="padding:6px 4px; textAlign:right; bold:true; borderBottom:2px solid #1F4E79">'100.0%'</td>
</tr>
</table>
</div>
<div style="marginBottom:10px">
<h2 style="color:#1F4E79; fontSize:13pt; bold:true; borderBottom:1px solid #1F4E79; paddingBottom:3px; marginBottom:8px">'二、全省区域分布图'</h2>
<div style="display:flex; justifyContent:center">
<svg style="width:700pt">${svg}</svg>
</div>
<p style="fontSize:9pt; color:#6c757d; italic:true; marginTop:6px">'图 1 四川省21个市(州)业务受理量分布(底图:四川省行政区划)'</p>
</div>
<div style="marginBottom:10px">
<h2 style="color:#1F4E79; fontSize:13pt; bold:true; borderBottom:1px solid #1F4E79; paddingBottom:3px; marginBottom:8px">'三、区域均衡分析'</h2>
<list style="listStyleType:none; paddingLeft:0px; fontSize:10pt">
<li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'成都平原经济区领跑:'</span>'成都市受理 42,180 件、占全省 23.8%,绵阳、德阳、眉山合计 28,660 件,四市合计占全省 39.9%。'</li>
<li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'民族地区增速领先:'</span>'甘孜藏族自治州同比增长 15.8%、阿坝藏族羌族自治州 14.2%、凉山彝族自治州 12.6%,均显著高于全省 7.5% 的平均增速。'</li>
<li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'尾部地区基数偏低:'</span>'阿坝 2,410 件、甘孜 2,860 件、攀枝花 3,240 件,三地合计仅占全省 4.8%,业务体量仍有较大提升空间。'</li>
<li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'增速分化明显:'</span>'21 个市(州)全部实现同比增长,但增速区间自 3.6%(攀枝花市)延伸至 15.8%(甘孜藏族自治州),区域间差异较大。'</li>
<li style="marginBottom:6px; padding:8px; backgroundColor:#E8F0F7; borderLeft:3px solid #1F4E79"><span style="bold:true; color:#1F4E79">'建议:'</span>'对攀枝花、自贡等低增速地区开展专项督导,同时将甘孜、阿坝的线上受理经验向全省推广,缩小区域服务能力差距。'</li>
</list>
</div>
<lineSeparator style="strokeColor:#DCE3EC"></lineSeparator>
<p style="color:#6c757d; fontSize:8pt; marginTop:8px">'数据来源:省公共信用信息平台 | 统计口径:2024年1月 - 12月 | 生成时间:2025年1月15日'</p>
</body>
</pdf>