东莞商城网站推广建设,seo排名赚能赚钱吗,网页地址怎么消除,微信公众号模板哪里找前言#xff1a; 代码复制粘贴即可用#xff0c;主要包含的功能有Excel模板下载、基于Excel数据导入、Excel数据导出。
根据实际情况修改一些细节即可#xff0c;最后有结果展示#xff0c;可以先看下结果#xff0c;是否是您想要的。
台上一分钟#xff0c;台下60秒 代码复制粘贴即可用主要包含的功能有Excel模板下载、基于Excel数据导入、Excel数据导出。
根据实际情况修改一些细节即可最后有结果展示可以先看下结果是否是您想要的。
台上一分钟台下60秒不喜勿喷。
觉得有用麻烦点个赞和关注。
新建SpringBoot项目引入下面的依赖 注这个依赖已经整合了 poi 和poi-ooxm无需单独引入。 !-- EasyExcel --dependencygroupIdcom.alibaba/groupIdartifactIdeasyexcel/artifactIdversion2.2.7/version/dependency
数据导入导出执行原理和思路 用户端逻辑 数据导入 用户先下载模板根据模板填入数据然后点击上传数据导出 用户在界面选择需要导出的数据导出条件点击导出。后台开发逻辑 模板下载 利用easyExcel生成文件然后将文件放进响应流中同时设置响应头为文件下载浏览器收到响应之后回去解析流中的内容然后进行下载。文件上传 用在填写好Excel内容之后会以文件上传的形式将文件上传到服务端此时我们只需要利用EasyExcel将文件流中的数据读出来即可。数据导出 后台在接收到用户的数据导出请求之后会根据请求中的筛选条件查询对应数据再将对应的数据填充进对应的导出模板中以流的形式响应给浏览器。其实和模板下载的差不错只是模板下载没有数据数据导出有数据而已。代码实现 说明以下代码是我根据具体业务编写之后整理出来的会有不足的地方欢迎指教
下拉框策略 如果没有此需求可以不要此类。
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;import java.util.Map;
import java.util.TreeMap;/*** 这个类的作用主要是给列增加下拉框* 主要是为了方便用户填写数据*/
public class CustomSheetWriteHandler implements SheetWriteHandler {/*** 存放下拉内容的集合* key为列的下标 value为下拉内容数组*/private final MapInteger, String[] map new TreeMap();/*** 工作簿下标从0开始*/private int index 0;/*** 给多少行添加下拉框这里默认给2000行*/private final int batchSize 2000;Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}/*** 宝藏在此如果下拉框内容总的长度超过255会导致Cell有下拉框但是下拉内容显示不了* 这时我们可以新建一个sheet将其隐藏然后将里面的内容引用到我们的下拉框列就可以。* 值得细品* param writeWorkbookHolder* param writeSheetHolder*/Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {// excel下标从0开始这里第二列的下拉选择内容map.put(1, new String[]{下拉内容一, 下拉内容二});// excel下标从0开始这里第三列的下拉选择内容map.put(3, new String[]{北京市, 上海市, 重庆市, 天津市});DataValidationHelper helper writeSheetHolder.getSheet().getDataValidationHelper();map.forEach((k, v) - {// 创建sheet突破下拉框255的限制// 获取一个workbookWorkbook workbook writeWorkbookHolder.getWorkbook();// 定义sheet的名称String sheetName sheet k;// 1.创建一个隐藏的sheet 名称为 proviceSheetSheet proviceSheet workbook.createSheet(sheetName);// 从第二个工作簿开始隐藏this.index;// 设置隐藏workbook.setSheetHidden(this.index, true);// 2.循环赋值为了防止下拉框的行数与隐藏域的行数相对应将隐藏域加到结束行之后for (int i 0, length v.length; i length; i) {// i:表示你开始的行数 0表示你开始的列数proviceSheet.createRow(i).createCell(0).setCellValue(v[i]);}Name category1Name workbook.createName();category1Name.setNameName(sheetName);// 4 $A$1:$A$N代表 以A列1行开始获取N行下拉数据category1Name.setRefersToFormula(sheetName !$A$1:$A$ (v.length));// 5 将刚才设置的sheet引用到你的下拉列表中,1表示从行的序号1开始开始行通常行的序号为0的行是表头50表示行的序号50结束行表示从行的序号1到50k表示开始列序号和结束列序号CellRangeAddressList addressList new CellRangeAddressList(1, batchSize, k, k);DataValidationConstraint constraint8 helper.createFormulaListConstraint(sheetName);DataValidation dataValidation3 helper.createValidation(constraint8, addressList);// 阻止输入非下拉选项的值dataValidation3.setErrorStyle(DataValidation.ErrorStyle.STOP);dataValidation3.setShowErrorBox(true);dataValidation3.setSuppressDropDownArrow(true);dataValidation3.createErrorBox(提示, 此值与单元格定义格式不一致);// validation.createPromptBox(填写说明,填写内容只能为下拉数据集中的单位其他单位将会导致无法入仓);writeSheetHolder.getSheet().addValidationData(dataValidation3);});}
}批注策略 给表头添加批注没有此需求可以不要
import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;/*** 自定义拦截器.新增注释,第一行头加批注* 这个类的作用主要是给表头添加批注*/
Slf4j
public class CommentWriteHandler implements RowWriteHandler {Overridepublic void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) {}Overridepublic void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {}Overridepublic void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {Sheet sheet writeSheetHolder.getSheet();Drawing? drawingPatriarch sheet.createDrawingPatriarch();// 在第一行 第二列创建一个批注Comment comment1 drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short)0, 0, (short)1, 1));// 输入批注信息comment1.setString(new XSSFRichTextString(批注1));// 将批注添加到单元格对象中sheet.getRow(0).getCell(0).setCellComment(comment1);Comment comment2 drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short)1, 0, (short)2, 1));// 输入批注信息comment2.setString(new XSSFRichTextString(批注2));// 将批注添加到单元格对象中sheet.getRow(0).getCell(1).setCellComment(comment2);Comment comment3 drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short)2, 0, (short)3, 1));// 输入批注信息comment3.setString(new XSSFRichTextString(批注3));// 将批注添加到单元格对象中sheet.getRow(0).getCell(2).setCellComment(comment3);}
}数据读取监听 导入数据时程序解析和读取数据用必须要
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** Excel数据解析监听器 数据解析方法异步执行* param T Excel中数据的类型*/
Getter
Setter
NoArgsConstructor
public class ExcelListenerT extends AnalysisEventListenerT {// 加入一个判断标签判断数据是否已经读取完private volatile boolean retryLock false;// 解析完成后的数据集合, 监听对象初始化之后立即初始化集合对象private final ListT dataList new ArrayList();// 每次最多导入条数private final int batchSize 2000;/*** 获取解析后的数据集合 如果数据还没有被解析完成会对读取该集合的线程进行阻塞直到数据读取完成之后进行解锁。* 如果一次导入数据超过batchSize条则以抛异常的形式阻止导入数据* return 解析后的数据集合*/public ListT getDataList() {while (true){if (retryLock){if (dataList.size() batchSize){// 手动清空数据内存数据减少内存消耗dataList.clear();throw new RuntimeException(一次最多导入 batchSize 条数据);} else {return dataList;}}}}/*** Excel每解析一行数据就会调用一次该方法* param data* one row value. Is is same as {link AnalysisContext#readRowHolder()}* param context* analysis context*/Overridepublic void invoke(T data, AnalysisContext context) {dataList.add(data);}/*** 读取表头内容* param headMap 表头部数据* param context 数据解析上下文*/Overridepublic void invokeHeadMap(MapInteger, String headMap, AnalysisContext context) {//System.out.println(表头 headMap);}/*** 流中的数据解析完成之后就会调用此方法* param context*/Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 数据解析完成解锁retryLock true;}/*** 解析过程如果发生异常会调用此方法* param exception* param context*/Overridepublic void onException(Exception exception, AnalysisContext context){throw new RuntimeException(Excel数据异常请检查或联系管理员);}
}
Excel工具类 封装统一的Excel操作入口
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteTable;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;Slf4j
public class ExcelUtil {/*** 导出数据为excel文件** param filename 文件名称* param dataResult 集合内的bean对象类型要与clazz参数一致* param clazz 集合内的bean对象类型要与clazz参数一致* param response HttpServlet响应对象*/public static void export(String filename, List? dataResult, Class? clazz, HttpServletResponse response) {response.setStatus(200);OutputStream outputStream null;ExcelWriter excelWriter null;try {if (StringUtils.isBlank(filename)) {throw new RuntimeException(filename 不能为空);}String fileName filename.concat(.xlsx);response.setHeader(Content-Disposition, attachment;filename URLEncoder.encode(fileName, utf-8));outputStream response.getOutputStream();// 根据不同的策略生成不同的ExcelWriter对象if (dataResult null){excelWriter getTemplateExcelWriter(outputStream);} else {excelWriter getExportExcelWriter(outputStream);}WriteTable writeTable EasyExcel.writerTable(0).head(clazz).needHead(true).build();WriteSheet writeSheet EasyExcel.writerSheet(fileName).build();// 写出数据excelWriter.write(dataResult, writeSheet, writeTable);} catch (Exception e) {log.error(导出excel数据异常, e);throw new RuntimeException(e);} finally {if (excelWriter ! null) {excelWriter.finish();}if (outputStream ! null) {try {outputStream.flush();outputStream.close();} catch (IOException e) {log.error(导出数据关闭流异常, e);}}}}/*** 根据不同策略生成不同的ExcelWriter对象 可根据实际情况修改* param outputStream 数据输出流* return 模板下载ExcelWriter对象*/private static ExcelWriter getTemplateExcelWriter(OutputStream outputStream){return EasyExcel.write(outputStream).registerWriteHandler(new CommentWriteHandler()) //增加批注策略.registerWriteHandler(new CustomSheetWriteHandler()) //增加下拉框策略.registerWriteHandler(getStyleStrategy()) //字体居中策略.build();}/*** 根据不同策略生成不同的ExcelWriter对象 可根据实际情况修改* param outputStream 数据输出流* return 数据导出ExcelWriter对象*/private static ExcelWriter getExportExcelWriter(OutputStream outputStream){return EasyExcel.write(outputStream).registerWriteHandler(getStyleStrategy()) //字体居中策略.build();}/*** 设置表格内容居中显示策略* return*/private static HorizontalCellStyleStrategy getStyleStrategy(){WriteCellStyle headWriteCellStyle new WriteCellStyle();//设置背景颜色headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//设置头字体WriteFont headWriteFont new WriteFont();headWriteFont.setFontHeightInPoints((short)13);headWriteFont.setBold(true);headWriteCellStyle.setWriteFont(headWriteFont);//设置头居中headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 内容策略WriteCellStyle writeCellStyle new WriteCellStyle();// 设置内容水平居中writeCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);return new HorizontalCellStyleStrategy(headWriteCellStyle, writeCellStyle);}/*** 根据Excel模板批量导入数据* param file 导入的Excel* param clazz 解析的类型* return 解析完成的数据*/public static List? importExcel(MultipartFile file, Class? clazz){if (file null || file.isEmpty()){throw new RuntimeException(没有文件或者文件内容为空);}ListObject dataList null;BufferedInputStream ipt null;try {InputStream is file.getInputStream();// 用缓冲流对数据流进行包装ipt new BufferedInputStream(is);// 数据解析监听器ExcelListenerObject listener new ExcelListener();// 读取数据EasyExcel.read(ipt, clazz,listener).sheet().doRead();// 获取去读完成之后的数据dataList listener.getDataList();} catch (Exception e){log.error(String.valueOf(e));throw new RuntimeException(数据导入失败 e);}return dataList;}}创建导入数据模板类 可以理解为这个类是我们和客户之间的约定程序根据这个模板类生成对应的Excel文件客户根据Excel文件将数据填充进来。然后用户将填充好的Excel文件上传到我们的程序中我们还得根据这个模板类来解析读取用户填充的数据。
根据实际业务调整上面的工具类会根据提供的模板生成对应的Excel文件。
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
import lombok.experimental.Accessors;import javax.validation.constraints.NotEmpty;
import java.io.Serializable;/*** 数据导入的Excel模板实体*/
Data
public class ImportExcelVo implements Serializable {private static final long serialVersionUID 1L;ColumnWidth(20)ExcelProperty(value 公司名称, index 0)private String name;ColumnWidth(20)ExcelProperty(value 公司联系电话, index 1)private String phone;ColumnWidth(28)ExcelProperty(value 公司统一社会信用代码, index 2)private String creditCode;ColumnWidth(15)ExcelProperty(value 区域, index 3)private String province;ColumnWidth(15)ExcelProperty(value 公司法人, index 4)private String legalPerson;ExcelProperty(value 备注, index 5)private String remark;
}创建数据导出模板 根据此模板向用户展示用户可以看到的字段。
根据实际业务调整上面的工具类会根据提供的模板生成对应的Excel文件。
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;/*** 资质信息导出实体*/
Data // Lombok注解用于生成getter setter
Accessors(chain true) //Lombok注解链式赋值使用
public class ExportExcelVo implements Serializable {private static final long serialVersionUID 1L;ColumnWidth(25)ExcelProperty(value 企业名称, index 0)private String name;ColumnWidth(25)ExcelProperty(value 社会统一信用代码, index 1)private String creditCode;ColumnWidth(15)ExcelProperty(value 曾用名, index 2)private String formerName;ColumnWidth(15)ExcelProperty(value 公司法人, index 3)private String legalPerson;ExcelProperty(value 区域, index 4)private String province;ExcelProperty(value 录入时间, index 5)private String createTime;ColumnWidth(15)ExcelProperty(value 公司股东, index 6)private String stockholder;ExcelProperty(value 企业联系方式, index 7)private String contact;}Web接口
import lombok.extern.slf4j.Slf4j;
import com.xxx.xxx.domain.vo.ExportExcelVo;
import com.xxx.xxx.domain.vo.ImportExcelVo;
import com.xxx.xxx.util.CommonResponse;
import com.xxx.xxx.util.ExcelUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** 事件控制器*/
Slf4j
RestController
RequestMapping(/api/excel)
public class ExcelController {/*** excel模板下载*/RequestMapping(value /template, method RequestMethod.GET)public CommonResponseString template(HttpServletResponse response){String fileName 导入模板下载 System.currentTimeMillis();try {ExcelUtil.export(fileName, null, ImportExcelVo.class, response);} catch (Exception e) {return CommonResponse.error(模板下载失败 e.getMessage());}return CommonResponse.success(模板下载成功);}/*** Excel批量导入数据* param file 导入文件*/RequestMapping(value /import, method RequestMethod.POST)public CommonResponseString importEvents(MultipartFile file){try {List? list ExcelUtil.importExcel(file, ImportExcelVo.class);System.out.println(list);return CommonResponse.success(数据导入完成);} catch (Exception e) {return CommonResponse.error(数据导入失败 e.getMessage());}}/*** excel数据导出* param size 导出条数 也可以是用户需要导出数据的条件* return*/RequestMapping(value /export, method RequestMethod.GET)public CommonResponseString export(Long size, HttpServletResponse response){// 模拟根据条件在数据库查询数据ArrayListExportExcelVo excelVos new ArrayList();for (int i 1; i size; i) {ExportExcelVo excelVo new ExportExcelVo();excelVo.setContact(String.valueOf(10000000000L i));excelVo.setName(公司名称 i);excelVo.setCreditCode(社会性用代码 i);excelVo.setProvince(地区 i);excelVo.setLegalPerson(法人 i);excelVo.setFormerName(曾用名 i);excelVo.setStockholder(投资人 i);excelVo.setCreateTime(new SimpleDateFormat(yyyy年MM月dd日 HH时mm分ss秒).format(new Date()));excelVos.add(excelVo);}String fileName 数据导出 System.currentTimeMillis();try {ExcelUtil.export(fileName, excelVos, ExportExcelVo.class, response);} catch (Exception e) {return CommonResponse.error(数据导出成功 e.getMessage());}return CommonResponse.success(数据导出失败);}}结果展示 模板下载 浏览器访问模板下载接口然后会根据接口返回的内容进行解析 数据导入 填充数据在下载下来的模板中填入数据 利用PostMan进行文件上传 数据导出 浏览器访问数据导出接口 文章转载自: http://www.morning.jbkcs.cn.gov.cn.jbkcs.cn http://www.morning.dqpnd.cn.gov.cn.dqpnd.cn http://www.morning.llyjx.cn.gov.cn.llyjx.cn http://www.morning.mrnnb.cn.gov.cn.mrnnb.cn http://www.morning.htqrh.cn.gov.cn.htqrh.cn http://www.morning.huihuangwh.cn.gov.cn.huihuangwh.cn http://www.morning.pqqhl.cn.gov.cn.pqqhl.cn http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn http://www.morning.dqdss.cn.gov.cn.dqdss.cn http://www.morning.zpqbh.cn.gov.cn.zpqbh.cn http://www.morning.nzfjm.cn.gov.cn.nzfjm.cn http://www.morning.zwzlf.cn.gov.cn.zwzlf.cn http://www.morning.bhrkx.cn.gov.cn.bhrkx.cn http://www.morning.ffgbq.cn.gov.cn.ffgbq.cn http://www.morning.pkfpl.cn.gov.cn.pkfpl.cn http://www.morning.xtxp.cn.gov.cn.xtxp.cn http://www.morning.tsynj.cn.gov.cn.tsynj.cn http://www.morning.lbrwm.cn.gov.cn.lbrwm.cn http://www.morning.sgmgz.cn.gov.cn.sgmgz.cn http://www.morning.mlfgx.cn.gov.cn.mlfgx.cn http://www.morning.jczjf.cn.gov.cn.jczjf.cn http://www.morning.rzysq.cn.gov.cn.rzysq.cn http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn http://www.morning.qclmz.cn.gov.cn.qclmz.cn http://www.morning.pqkyx.cn.gov.cn.pqkyx.cn http://www.morning.yrbp.cn.gov.cn.yrbp.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.rxkq.cn.gov.cn.rxkq.cn http://www.morning.yfcyh.cn.gov.cn.yfcyh.cn http://www.morning.wmfh.cn.gov.cn.wmfh.cn http://www.morning.ttcmdsg.cn.gov.cn.ttcmdsg.cn http://www.morning.rnzjc.cn.gov.cn.rnzjc.cn http://www.morning.rqlbp.cn.gov.cn.rqlbp.cn http://www.morning.rxxdk.cn.gov.cn.rxxdk.cn http://www.morning.hqllj.cn.gov.cn.hqllj.cn http://www.morning.wnywk.cn.gov.cn.wnywk.cn http://www.morning.wqwbj.cn.gov.cn.wqwbj.cn http://www.morning.kaoshou.net.gov.cn.kaoshou.net http://www.morning.nppml.cn.gov.cn.nppml.cn http://www.morning.dkgtr.cn.gov.cn.dkgtr.cn http://www.morning.knqck.cn.gov.cn.knqck.cn http://www.morning.lxhny.cn.gov.cn.lxhny.cn http://www.morning.kabaifu.com.gov.cn.kabaifu.com http://www.morning.wjlhp.cn.gov.cn.wjlhp.cn http://www.morning.lxhrq.cn.gov.cn.lxhrq.cn http://www.morning.wffxr.cn.gov.cn.wffxr.cn http://www.morning.plwfx.cn.gov.cn.plwfx.cn http://www.morning.dlbpn.cn.gov.cn.dlbpn.cn http://www.morning.qsmdd.cn.gov.cn.qsmdd.cn http://www.morning.hbkkc.cn.gov.cn.hbkkc.cn http://www.morning.lhrxq.cn.gov.cn.lhrxq.cn http://www.morning.qhczg.cn.gov.cn.qhczg.cn http://www.morning.lwzpp.cn.gov.cn.lwzpp.cn http://www.morning.snyqb.cn.gov.cn.snyqb.cn http://www.morning.bntgy.cn.gov.cn.bntgy.cn http://www.morning.dgckn.cn.gov.cn.dgckn.cn http://www.morning.zylzk.cn.gov.cn.zylzk.cn http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.jrkzk.cn.gov.cn.jrkzk.cn http://www.morning.yrjxr.cn.gov.cn.yrjxr.cn http://www.morning.mxlmn.cn.gov.cn.mxlmn.cn http://www.morning.nbiotank.com.gov.cn.nbiotank.com http://www.morning.wypyl.cn.gov.cn.wypyl.cn http://www.morning.fnczn.cn.gov.cn.fnczn.cn http://www.morning.gglhj.cn.gov.cn.gglhj.cn http://www.morning.rpfpx.cn.gov.cn.rpfpx.cn http://www.morning.bxbkq.cn.gov.cn.bxbkq.cn http://www.morning.plzgt.cn.gov.cn.plzgt.cn http://www.morning.bmgdl.cn.gov.cn.bmgdl.cn http://www.morning.qpnb.cn.gov.cn.qpnb.cn http://www.morning.jglqn.cn.gov.cn.jglqn.cn http://www.morning.dmcqy.cn.gov.cn.dmcqy.cn http://www.morning.lhxdq.cn.gov.cn.lhxdq.cn http://www.morning.pabxcp.com.gov.cn.pabxcp.com http://www.morning.mjctt.cn.gov.cn.mjctt.cn http://www.morning.pqypt.cn.gov.cn.pqypt.cn http://www.morning.sjwws.cn.gov.cn.sjwws.cn http://www.morning.mtmnk.cn.gov.cn.mtmnk.cn http://www.morning.dbtdy.cn.gov.cn.dbtdy.cn http://www.morning.xbptx.cn.gov.cn.xbptx.cn