最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Apache POI實現(xiàn)導(dǎo)出Excel的實戰(zhàn)指南

 更新時間:2026年04月02日 08:34:08   作者:SheepDog1998  
在企業(yè)級開發(fā)中,Excel 數(shù)據(jù)導(dǎo)出是高頻需求,本文基于 Apache POI 實現(xiàn)災(zāi)情速報員數(shù)據(jù) Excel 導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

在企業(yè)級開發(fā)中,Excel 數(shù)據(jù)導(dǎo)出是高頻需求,尤其在統(tǒng)計類系統(tǒng)中,不僅要求功能穩(wěn)定,更要求格式規(guī)范、代碼可維護——避免硬編碼、支持靈活增刪列,是生產(chǎn)環(huán)境代碼的核心要求。

本文基于 Apache POI 實現(xiàn)數(shù)據(jù) Excel 導(dǎo)出功能,重點解決「列數(shù)寫死、增刪列需全局修改」的痛點,同時完善框線、行高、空數(shù)據(jù)處理、Redis 安全轉(zhuǎn)換等細(xì)節(jié),最終產(chǎn)出 列數(shù)與表頭自動聯(lián)動、格式美觀、可直接上線、易維護 的企業(yè)級代碼。

一、需求背景與核心目標(biāo)

1. 基礎(chǔ)需求

  • 從 Redis 中獲取災(zāi)情速報員列表,導(dǎo)出為 XLSX 格式 Excel
  • 表頭:加粗、水平+垂直居中、完整細(xì)框線
  • 數(shù)據(jù)行:居中、完整細(xì)框線、統(tǒng)一舒適行高
  • 空數(shù)據(jù):顯示友好提示,格式與數(shù)據(jù)行保持一致
  • 字段空值:安全處理,避免導(dǎo)出異常

2. 核心優(yōu)化目標(biāo)(解決痛點)

  • 摒棄列數(shù)硬編碼(如 j < 9),實現(xiàn)「表頭聯(lián)動列數(shù)」
  • 增刪列僅需修改表頭數(shù)組,全局自動適配,無需修改循環(huán)條件
  • 代碼解耦、注釋清晰,符合企業(yè)級開發(fā)規(guī)范,便于長期維護

二、核心技術(shù)棧

JDK 8+

Spring Boot(Redis 緩存操作)

Apache POI 4.x+(Excel 核心操作)

Commons Lang3(字符串非空判斷,解決 hasText 報錯)

SLF4J(日志記錄,便于問題排查)

三、完整可運行代碼(最終完美版)

代碼已整合所有優(yōu)化,列數(shù)與表頭自動聯(lián)動,增刪列無需修改循環(huán)邏輯,可直接復(fù)制到項目中使用(依賴類僅作示意,需替換為項目實際類)。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.lang3.StringUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
 * 災(zāi)情速報員 Excel 導(dǎo)出服務(wù)
 * 核心特性:
 * 1. 列數(shù)與表頭自動聯(lián)動,增刪列僅改表頭數(shù)組,無需修改循環(huán)條件
 * 2. 完整細(xì)框線、統(tǒng)一行高、表頭加粗居中,格式規(guī)范美觀
 * 3. Redis 數(shù)據(jù)安全轉(zhuǎn)換,避免類型強轉(zhuǎn)異常
 * 4. 空數(shù)據(jù)友好提示、字段空值安全處理,防止導(dǎo)出報錯
 * 5. 資源安全關(guān)閉,避免內(nèi)存泄漏
 * @author 編程實戰(zhàn)博客
 */
public class ExcelExportService {
    private static final Logger log = LoggerFactory.getLogger(ExcelExportService.class);
    /**
     * 統(tǒng)一行高(20點為Excel舒適行高,可根據(jù)需求調(diào)整為18/22)
     */
    private static final short ROW_HEIGHT = 20;
    /**
     * 【核心】表頭全局唯一入口,所有列數(shù)相關(guān)邏輯自動聯(lián)動
     * 增刪列:僅需修改此數(shù)組,其他地方無需改動
     */
    private static final String[] HEADERS = {
        "序號", "姓名", "電話", "震中距離", "市州", "區(qū)縣", "鄉(xiāng)鎮(zhèn)/街道", "村/社區(qū)", "備注"
    };
    /**
     * 導(dǎo)出災(zāi)情速報員數(shù)據(jù)為Excel字節(jié)流
     * @param key Redis緩存key(用于獲取數(shù)據(jù))
     * @return Excel字節(jié)流(可直接響應(yīng)前端下載)
     */
    public ByteArrayOutputStream exportToExcel(String key) {
        // 初始化空集合,避免空指針異常
        List<DisasterOfficer> doList = new ArrayList<>();
        // 1. 安全從Redis獲取數(shù)據(jù),避免類型強轉(zhuǎn)異常
        if (StringUtils.isNotBlank(key)) {
            Object cacheObj = redisCache.getCacheObject(Constants.DO_Redis + "_" + key);
            // 類型校驗:確保緩存數(shù)據(jù)是List<DisasterOfficer>
            if (cacheObj instanceof List<?>) {
                doList = (List<DisasterOfficer>) cacheObj;
            } else if (cacheObj != null) {
                log.error("Redis緩存數(shù)據(jù)類型異常,key:{},預(yù)期List<DisasterOfficer>", Constants.DO_Redis + "_" + key);
                return new ByteArrayOutputStream();
            }
        }
        Workbook workbook = null;
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            // 2. 創(chuàng)建Excel工作簿(XSSFWorkbook對應(yīng)XLSX格式)
            workbook = new XSSFWorkbook();
            Sheet sheet = workbook.createSheet("災(zāi)情速報員");
            // 3. 創(chuàng)建單元格樣式(表頭樣式+數(shù)據(jù)樣式,均帶完整框線)
            CellStyle headerStyle = createHeaderCellStyle(workbook);
            CellStyle dataStyle = createDataCellStyle(workbook);
            // 4. 構(gòu)建表頭(自動適配表頭列數(shù))
            Row headerRow = sheet.createRow(0);
            headerRow.setHeightInPoints(ROW_HEIGHT);
            buildHeader(headerRow, headerStyle);
            // 5. 填充數(shù)據(jù)(自動適配表頭列數(shù),空數(shù)據(jù)自動提示)
            fillData(sheet, doList, dataStyle);
            // 6. 將Excel寫入字節(jié)流,返回給前端下載
            workbook.write(outputStream);
            log.info("災(zāi)情速報員Excel導(dǎo)出成功,數(shù)據(jù)條數(shù):{}", doList.size());
        } catch (IOException e) {
            log.error("災(zāi)情速報員Excel導(dǎo)出失敗", e); // 打印完整異常堆棧,便于排查
        } finally {
            // 7. 強制關(guān)閉Workbook,釋放重量級資源,避免內(nèi)存泄漏(核心?。?
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (IOException e) {
                    log.error("關(guān)閉Excel工作簿失敗", e);
                }
            }
        }
        return outputStream;
    }
    /**
     * 創(chuàng)建表頭樣式:加粗+水平垂直居中+完整細(xì)框線
     */
    private CellStyle createHeaderCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // 字體設(shè)置:加粗、12號字
        Font font = workbook.createFont();
        font.setBold(true);
        font.setFontHeightInPoints((short) 12);
        style.setFont(font);
        // 對齊方式:水平居中+垂直居中
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // 完整框線:上、下、左、右均為細(xì)實線
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        return style;
    }
    /**
     * 創(chuàng)建數(shù)據(jù)行樣式:水平垂直居中+完整細(xì)框線
     */
    private CellStyle createDataCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // 與表頭統(tǒng)一框線樣式,保證整體美觀
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        return style;
    }
    /**
     * 構(gòu)建表頭:自動適配表頭列數(shù),設(shè)置列寬、單元格值和樣式
     */
    private void buildHeader(Row headerRow, CellStyle style) {
        Sheet sheet = headerRow.getSheet();
        // 循環(huán)次數(shù) = 表頭數(shù)組長度,自動適配列數(shù)
        for (int i = 0; i < HEADERS.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(HEADERS[i]); // 表頭文本
            cell.setCellStyle(style);      // 應(yīng)用表頭樣式
            sheet.setColumnWidth(i, 20 * 256); // 統(tǒng)一列寬(20個字符,適配大部分文本)
        }
    }
    /**
     * 填充數(shù)據(jù):自動適配表頭列數(shù),支持空數(shù)據(jù)提示、空值安全處理
     */
    private void fillData(Sheet sheet, List<DisasterOfficer> doList, CellStyle style) {
        int columnCount = HEADERS.length; // 自動獲取總列數(shù),與表頭聯(lián)動
        // 場景1:無數(shù)據(jù)/數(shù)據(jù)過期,顯示友好提示
        if (doList == null || doList.isEmpty()) {
            Row emptyRow = sheet.createRow(1);
            emptyRow.setHeightInPoints(ROW_HEIGHT); // 與數(shù)據(jù)行統(tǒng)一行高
            // 提示信息放在第一列
            Cell tipCell = emptyRow.createCell(0);
            tipCell.setCellValue("查詢無數(shù)據(jù)或者已過期,請重新查詢下載!");
            tipCell.setCellStyle(style);
            // 自動補全所有列,保證框線完整(循環(huán)次數(shù)=總列數(shù))
            for (int j = 1; j < columnCount; j++) {
                emptyRow.createCell(j).setCellStyle(style);
            }
            return;
        }
        // 場景2:有數(shù)據(jù),循環(huán)填充(序號從1開始)
        for (int i = 0; i < doList.size(); i++) {
            DisasterOfficer officer = doList.get(i);
            Row dataRow = sheet.createRow(i + 1); // 行號從1開始(0行為表頭)
            dataRow.setHeightInPoints(ROW_HEIGHT);
            // 列順序與表頭嚴(yán)格對應(yīng),空值自動轉(zhuǎn)為空字符串
            dataRow.createCell(0).setCellValue(i + 1); // 序號
            dataRow.createCell(1).setCellValue(getSafeValue(officer.getContacts())); // 姓名
            dataRow.createCell(2).setCellValue(getSafeValue(officer.getPhone())); // 電話
            dataRow.createCell(3).setCellValue(getSafeValue(officer.getDistance())); // 震中距離
            dataRow.createCell(4).setCellValue(getSafeValue(officer.getCity())); // 市州
            dataRow.createCell(5).setCellValue(getSafeValue(officer.getCounty())); // 區(qū)縣
            dataRow.createCell(6).setCellValue(getSafeValue(officer.getTowns())); // 鄉(xiāng)鎮(zhèn)/街道
            dataRow.createCell(7).setCellValue(getSafeValue(officer.getVillage())); // 村/社區(qū)
            dataRow.createCell(8).setCellValue(getSafeValue(officer.getRemark())); // 備注
            // 為所有單元格應(yīng)用樣式(循環(huán)次數(shù)=總列數(shù),自動適配)
            for (int j = 0; j < columnCount; j++) {
                dataRow.getCell(j).setCellStyle(style);
            }
        }
    }
    /**
     * 空值安全處理工具方法:null轉(zhuǎn)為空字符串,避免導(dǎo)出異常
     */
    private String getSafeValue(Object value) {
        return value == null ? "" : value.toString();
    }
    // ===================== 以下為項目依賴類(僅作示意,需替換為實際類) =====================
    /**
     * 常量類:Redis緩存key前綴
     */
    private static class Constants {
        public static String DO_Redis = "DISASTER_OFFICER"; // 災(zāi)情速報員緩存前綴
    }
    /**
     * Redis緩存工具類(示意),實際項目中替換為自己的Redis工具
     */
    private static class redisCache {
        public static Object getCacheObject(String key) {
            // 實際邏輯:從Redis獲取數(shù)據(jù),此處僅作占位
            return null;
        }
    }
    /**
     * 災(zāi)情速報員實體類(已包含備注字段)
     */
    private static class DisasterOfficer {
        private String contacts;  // 姓名
        private String phone;     // 電話
        private String distance;  // 震中距離
        private String city;      // 市州
        private String county;    // 區(qū)縣
        private String towns;     // 鄉(xiāng)鎮(zhèn)/街道
        private String village;   // 村/社區(qū)
        private String remark;    // 備注(新增字段)
        // getter方法(必須,用于獲取字段值)
        public String getContacts() { return contacts; }
        public String getPhone() { return phone; }
        public String getDistance() { return distance; }
        public String getCity() { return city; }
        public String getCounty() { return county; }
        public String getTowns() { return towns; }
        public String getVillage() { return village; }
        public String getRemark() { return remark; }
    }
}

四、核心優(yōu)化解析(重點!)

本次優(yōu)化的核心是「列數(shù)與表頭聯(lián)動」,徹底解決硬編碼痛點,同時完善其他細(xì)節(jié),讓代碼達到企業(yè)級可維護標(biāo)準(zhǔn)。

1. 核心優(yōu)化:表頭全局唯一,列數(shù)自動聯(lián)動

將表頭定義為全局常量數(shù)組,作為所有列數(shù)邏輯的唯一入口,這是實現(xiàn)「自動聯(lián)動」的關(guān)鍵:

// 全局唯一表頭,增刪列僅改這里
private static final String[] HEADERS = {"序號", "姓名", ..., "備注"};

所有涉及列數(shù)的循環(huán),均使用 HEADERS.lengthcolumnCount = HEADERS.length,徹底刪除寫死數(shù)字(如 j < 9):

  • 表頭構(gòu)建:for (int i = 0; i < HEADERS.length; i++)
  • 空數(shù)據(jù)補框線:for (int j = 1; j < columnCount; j++)
  • 數(shù)據(jù)行樣式應(yīng)用:for (int j = 0; j < columnCount; j++)

效果:以后增刪列,只需修改HEADERS 數(shù)組,其他所有邏輯自動適配,無需手動修改任何循環(huán)條件,杜絕因列數(shù)修改導(dǎo)致的錯位、報錯。

2. 樣式優(yōu)化:完整框線+統(tǒng)一行高

  • 完整框線:通過 setBorderTop/Bottom/Left/Right(BorderStyle.THIN) 為表頭和數(shù)據(jù)行設(shè)置細(xì)實線邊框,空數(shù)據(jù)行也會補全所有列的樣式,保證框線完整無缺失。
  • 統(tǒng)一行高:定義常量 ROW_HEIGHT = 20(Excel 舒適行高),表頭、數(shù)據(jù)行、空數(shù)據(jù)行統(tǒng)一應(yīng)用,視覺整潔,可一鍵調(diào)整。
  • 對齊優(yōu)化:表頭和數(shù)據(jù)行均設(shè)置「水平+垂直居中」,避免文本偏移,提升可讀性。

3. 異常與安全處理(生產(chǎn)環(huán)境必加)

  • Redis 類型安全轉(zhuǎn)換:通過 instanceof 校驗緩存數(shù)據(jù)類型,避免強制類型轉(zhuǎn)換拋出 ClassCastException。
  • 空值安全處理:新增 getSafeValue 方法,將 null 轉(zhuǎn)為空字符串,避免實體類字段為 null 導(dǎo)致的導(dǎo)出異常。
  • 資源安全關(guān)閉:在 finally 塊中強制關(guān)閉 Workbook,釋放重量級資源,防止內(nèi)存泄漏(生產(chǎn)環(huán)境重點關(guān)注)。
  • 日志完善:使用 log.error 記錄異常(含完整堆棧),便于線上問題排查;記錄導(dǎo)出成功的條數(shù),方便統(tǒng)計。

4. 解決 StringUtils 報錯痛點

開發(fā)中常見 StringUtils.hasText 無法解析的問題,原因是:hasText 屬于 Spring 包(org.springframework.util.StringUtils),而項目常用 Apache Commons 包(org.apache.commons.lang3.StringUtils)。

解決方案:使用 Apache Commons 包的 isNotBlank 方法,功能與 hasText 完全一致(非 null、非空、非全空格),避免報錯:

// 正確寫法(無報錯,兼容Apache Commons包)
if (StringUtils.isNotBlank(key)) { ... }

五、使用說明(極簡)

將代碼復(fù)制到項目中,替換 Constants、redisCache、DisasterOfficer 為項目實際類;

實體類 DisasterOfficer 新增 remark 字段及 getter 方法(已有,無需修改);

增刪列:僅修改 HEADERS 數(shù)組,其他邏輯自動適配;

調(diào)用 exportToExcel(String key) 方法,獲取字節(jié)流,響應(yīng)前端即可實現(xiàn)下載。

六、導(dǎo)出效果預(yù)覽

表頭:加粗、居中、完整細(xì)框線,列寬統(tǒng)一,視覺整潔;

數(shù)據(jù)行:居中顯示、完整框線、行高一致,空值顯示為空字符串;

空數(shù)據(jù):居中顯示提示信息,所有列均有框線,格式與數(shù)據(jù)行統(tǒng)一;

擴展性:增刪列后,框線、循環(huán)、樣式自動適配,無任何錯位。

七、適用場景

后臺管理系統(tǒng)各類數(shù)據(jù)導(dǎo)出(用戶、報表、統(tǒng)計數(shù)據(jù)等);

災(zāi)情、政務(wù)、醫(yī)療等對格式規(guī)范要求高的導(dǎo)出場景;

需要靈活增刪列、追求代碼可維護性的生產(chǎn)環(huán)境;

基于 Redis 緩存數(shù)據(jù)的導(dǎo)出需求。

八、總結(jié)

這份代碼是企業(yè)級 Excel 導(dǎo)出的標(biāo)準(zhǔn)方案,核心優(yōu)勢在于:

  • 可維護性:列數(shù)與表頭自動聯(lián)動,增刪列無需修改循環(huán)邏輯,降低維護成本;
  • 穩(wěn)定性:完善的異常處理、資源關(guān)閉、空值處理,杜絕線上報錯;
  • 美觀性:完整框線、統(tǒng)一行高、居中對齊,導(dǎo)出的 Excel 符合企業(yè)規(guī)范;
  • 通用性:可快速適配其他業(yè)務(wù)實體(如用戶、訂單),只需修改表頭和實體類關(guān)聯(lián)。

如果需要擴展功能(如合并單元格、多 Sheet 導(dǎo)出、大數(shù)據(jù)量 SXSSF 優(yōu)化、CSV 導(dǎo)出),可直接在此基礎(chǔ)上修改,或留言補充需求~

到此這篇關(guān)于Java Apache POI實現(xiàn)導(dǎo)出Excel的實戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Java POI導(dǎo)出Excel數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用aop實現(xiàn)全局異常處理

    使用aop實現(xiàn)全局異常處理

    這篇文章主要為大家詳細(xì)介紹了使用aop實現(xiàn)全局異常處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Java實現(xiàn)PDF表格轉(zhuǎn)換為CSV的示例代碼

    Java實現(xiàn)PDF表格轉(zhuǎn)換為CSV的示例代碼

    在很多企業(yè)辦公和數(shù)據(jù)分析的場景中,PDF 中常常存放著報表、清單或統(tǒng)計數(shù)據(jù),本文將介紹如何借助 Free Spire.PDF for Java,在 Java 程序中完成 PDF 表格到 CSV 的自動轉(zhuǎn)換,感興趣的看了解下
    2025-08-08
  • 圖文詳解mybatis+postgresql平臺搭建步驟

    圖文詳解mybatis+postgresql平臺搭建步驟

    從頭開始搭建一個mybatis+postgresql平臺,這篇文章主要介紹了圖文詳解mybatis+postgresql平臺搭建步驟,感興趣的小伙伴們可以參考一下
    2016-07-07
  • windows java.exe內(nèi)存暴漲解決、idea跑java\ tomcat內(nèi)存無限增長

    windows java.exe內(nèi)存暴漲解決、idea跑java\ tomcat內(nèi)存無限增長

    這篇文章主要介紹了windows java.exe內(nèi)存暴漲解決、idea跑 java\ tomcat內(nèi)存無限增長,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java實現(xiàn)摳圖片文字或簽名的完整代碼

    Java實現(xiàn)摳圖片文字或簽名的完整代碼

    這篇文章主要介紹了java摳圖片文字或簽名的運行原理,本文分步驟通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 16個SpringBoot擴展接口的總結(jié)和實例

    16個SpringBoot擴展接口的總結(jié)和實例

    Spring Boot是一個開源的Java框架,它簡化了基于Spring的應(yīng)用程序的開發(fā)和部署,它提供了許多強大的特性和擴展接口,本文給大家介紹了16個常用的Spring Boot擴展接口,需要的朋友可以參考下
    2023-09-09
  • 深度解析Java @Serial 注解及常見錯誤案例

    深度解析Java @Serial 注解及常見錯誤案例

    Java14引入@Serial注解,用于編譯時校驗序列化成員,替代傳統(tǒng)方式解決運行時錯誤,適用于Serializable類的方法/字段,需注意簽名和位置校驗,建議新項目采用,本文給大家介紹Java @Serial 注解的相關(guān)知識,感興趣的朋友一起看看吧
    2025-07-07
  • SpringCloudGateway網(wǎng)關(guān)處攔截并修改請求的操作方法

    SpringCloudGateway網(wǎng)關(guān)處攔截并修改請求的操作方法

    這篇文章主要介紹了SpringCloudGateway網(wǎng)關(guān)處攔截并修改請求的操作方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • Java中jdk1.8和jdk17相互切換實戰(zhàn)步驟

    Java中jdk1.8和jdk17相互切換實戰(zhàn)步驟

    之前做Java項目時一直用的是jdk1.8,現(xiàn)在想下載另一個jdk版本17,并且在之后的使用中可以進行相互切換,下面這篇文章主要給大家介紹了關(guān)于Java中jdk1.8和jdk17相互切換的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Java?泛型超詳細(xì)入門講解

    Java?泛型超詳細(xì)入門講解

    這篇文章主要介紹了Java基礎(chǔ)泛型詳情,泛型是JDK5中引入的特性,它提供了編譯時類型安全檢測機制,該機制允許在編譯時檢測到非法的類型,下面文章的詳細(xì)介紹,需要的朋友可以參考一下
    2022-04-04

最新評論

华阴市| 津南区| 辽阳市| 简阳市| 赞皇县| 广灵县| 乌拉特前旗| 区。| 维西| 武强县| 鲜城| 彩票| 万州区| 财经| 繁峙县| 承德县| 康乐县| 隆子县| 延庆县| 黔西县| 西贡区| 项城市| 邛崃市| 平顶山市| 嘉鱼县| 肥东县| 呼和浩特市| 宁河县| 清远市| 黄浦区| 纳雍县| 沁阳市| 苗栗县| 平果县| 社会| 小金县| 阳城县| 确山县| 新源县| 嘉善县| 四会市|