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

Apache POI導(dǎo)出Excel遇NoClassDefFoundError的原因分析與解決方案

 更新時(shí)間:2025年10月13日 08:22:36   作者:碼農(nóng)阿豪@新空間  
在日常的Java開發(fā)中,我們經(jīng)常需要實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到Excel的功能,本文將簡(jiǎn)單介紹Apache POI導(dǎo)出Excel遇NoClassDefFoundError錯(cuò)誤的原因與解決,希望對(duì)大家有所幫助

引言

在日常的Java開發(fā)中,我們經(jīng)常需要實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到Excel的功能。Apache POI作為最流行的Java操作Microsoft Office格式文件的開源庫,被廣泛應(yīng)用于各種業(yè)務(wù)場(chǎng)景。然而,在使用過程中,開發(fā)者可能會(huì)遇到各種棘手的異常,其中NoClassDefFoundError: Could not initialize class org.apache.poi.xssf.streaming.SXSSFWorkbook就是一個(gè)典型的代表。

本文將從問題現(xiàn)象出發(fā),深入分析該錯(cuò)誤產(chǎn)生的原因,并提供完整的解決方案和最佳實(shí)踐,幫助開發(fā)者徹底解決這一技術(shù)難題。

問題現(xiàn)象與錯(cuò)誤分析

錯(cuò)誤詳情

當(dāng)嘗試使用Apache POI導(dǎo)出Excel文件時(shí),系統(tǒng)拋出以下異常:

{
    "msg": "Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.poi.xssf.streaming.SXSSFWorkbook",
    "code": 500
}

錯(cuò)誤類型解析

NoClassDefFoundErrorClassNotFoundException雖然都涉及類加載問題,但有著本質(zhì)區(qū)別:

  • ClassNotFoundException:發(fā)生在編譯時(shí)類路徑中存在,但運(yùn)行時(shí)缺少相關(guān)JAR包的情況
  • NoClassDefFoundError:發(fā)生在編譯時(shí)類存在,但運(yùn)行時(shí)初始化失敗的情況

具體到我們的錯(cuò)誤信息,Could not initialize class表明JVM找到了SXSSFWorkbook類,但在初始化過程中失敗了。

根本原因深度剖析

1. 依賴不完整或版本沖突

這是最常見的原因。Apache POI由多個(gè)模塊組成,而SXSSFWorkbook位于poi-ooxml模塊中,需要多個(gè)相關(guān)依賴協(xié)同工作。

POI模塊架構(gòu)解析:

Apache POI項(xiàng)目結(jié)構(gòu):

- poi:核心模塊,處理.xls格式

- poi-ooxml:處理.xlsx格式

- poi-scratchpad:處理較少見的文檔格式

- poi-examples:示例代碼

- poi-excelant:Excel公式計(jì)算

2. 類初始化失敗

SXSSFWorkbook在靜態(tài)初始化過程中可能因以下原因失?。?/p>

  • 缺少必要的配置文件
  • 靜態(tài)代碼塊中拋出異常
  • 依賴的Native庫加載失敗
  • 安全權(quán)限限制

3. 環(huán)境配置問題

  • 臨時(shí)目錄權(quán)限不足
  • 磁盤空間耗盡
  • 內(nèi)存配置不合理
  • 服務(wù)器安全策略限制

完整解決方案

方案一:完善依賴配置

Maven項(xiàng)目配置

<properties>
    <poi.version>5.2.3</poi.version>
</properties>

<dependencies>
    <!-- POI核心模塊 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>${poi.version}</version>
    </dependency>
    
    <!-- POI OOXML支持 (.xlsx格式) -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>${poi.version}</version>
    </dependency>
    
    <!-- XML Beans支持 -->
    <dependency>
        <groupId>org.apache.xmlbeans</groupId>
        <artifactId>xmlbeans</artifactId>
        <version>5.1.1</version>
    </dependency>
    
    <!-- Commons Compress壓縮支持 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-compress</artifactId>
        <version>1.21</version>
    </dependency>
    
    <!-- Curvesapi用于圖表支持 -->
    <dependency>
        <groupId>com.github.virtuald</groupId>
        <artifactId>curvesapi</artifactId>
        <version>1.07</version>
    </dependency>
</dependencies>

Gradle項(xiàng)目配置

dependencies {
    implementation 'org.apache.poi:poi:5.2.3'
    implementation 'org.apache.poi:poi-ooxml:5.2.3'
    implementation 'org.apache.xmlbeans:xmlbeans:5.1.1'
    implementation 'org.apache.commons:commons-compress:1.21'
    implementation 'com.github.virtuald:curvesapi:1.07'
}

方案二:依賴沖突排查

使用以下命令檢查依賴樹:

Maven項(xiàng)目:

mvn dependency:tree -Dincludes=org.apache.poi

Gradle項(xiàng)目:

gradle dependencies | grep poi

如果發(fā)現(xiàn)版本沖突,可以使用排除依賴:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>some-library</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </exclusion>
    </exclusions>
</dependency>

方案三:完整的SXSSFWorkbook使用示例

@Service
public class ExcelExportService {
    
    private static final Logger logger = LoggerFactory.getLogger(ExcelExportService.class);
    
    /**
     * 導(dǎo)出數(shù)據(jù)到Excel
     */
    public void exportToExcel(HttpServletResponse response, 
                             List<DataDTO> dataList, 
                             String fileName) {
        SXSSFWorkbook workbook = null;
        try {
            // 設(shè)置響應(yīng)頭
            setupResponse(response, fileName);
            
            // 初始化SXSSFWorkbook
            workbook = createWorkbook();
            
            // 創(chuàng)建工作表
            SXSSFSheet sheet = workbook.createSheet("數(shù)據(jù)導(dǎo)出");
            
            // 創(chuàng)建表頭
            createHeaderRow(sheet);
            
            // 填充數(shù)據(jù)
            fillData(sheet, dataList);
            
            // 自動(dòng)調(diào)整列寬
            autoSizeColumns(sheet);
            
            // 寫入響應(yīng)流
            workbook.write(response.getOutputStream());
            logger.info("Excel導(dǎo)出成功,文件名:{}", fileName);
            
        } catch (Exception e) {
            logger.error("Excel導(dǎo)出失敗", e);
            throw new BusinessException("導(dǎo)出Excel文件失敗");
        } finally {
            // 清理資源
            cleanupWorkbook(workbook);
        }
    }
    
    /**
     * 創(chuàng)建SXSSFWorkbook實(shí)例
     */
    private SXSSFWorkbook createWorkbook() {
        try {
            // 設(shè)置臨時(shí)文件目錄
            File tempDir = new File(System.getProperty("java.io.tmpdir"), "poi-temp");
            if (!tempDir.exists()) {
                tempDir.mkdirs();
            }
            
            // 創(chuàng)建SXSSFWorkbook,設(shè)置每100行在內(nèi)存中,超過的寫入磁盤
            SXSSFWorkbook workbook = new SXSSFWorkbook(100);
            
            // 啟用臨時(shí)文件壓縮以減少磁盤占用
            workbook.setCompressTempFiles(true);
            
            return workbook;
            
        } catch (Exception e) {
            logger.error("創(chuàng)建SXSSFWorkbook失敗", e);
            throw new RuntimeException("初始化Excel工作簿失敗", e);
        }
    }
    
    /**
     * 設(shè)置HTTP響應(yīng)
     */
    private void setupResponse(HttpServletResponse response, String fileName) 
            throws UnsupportedEncodingException {
        // 設(shè)置Content-Type
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        
        // 設(shè)置字符編碼
        response.setCharacterEncoding("UTF-8");
        
        // 設(shè)置文件下載頭
        String encodedFileName = URLEncoder.encode(fileName, "UTF-8")
                .replaceAll("\\+", "%20");
        response.setHeader("Content-Disposition", 
                "attachment; filename=" + encodedFileName + ".xlsx");
        
        // 禁用緩存
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);
    }
    
    /**
     * 創(chuàng)建表頭行
     */
    private void createHeaderRow(SXSSFSheet sheet) {
        String[] headers = {"ID", "姓名", "年齡", "郵箱", "創(chuàng)建時(shí)間"};
        
        Row headerRow = sheet.createRow(0);
        CellStyle headerStyle = createHeaderCellStyle(sheet.getWorkbook());
        
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
            cell.setCellStyle(headerStyle);
        }
    }
    
    /**
     * 創(chuàng)建表頭樣式
     */
    private CellStyle createHeaderCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        
        // 設(shè)置背景色
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        
        // 設(shè)置邊框
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        
        // 設(shè)置字體
        Font font = workbook.createFont();
        font.setBold(true);
        font.setFontHeightInPoints((short) 12);
        style.setFont(font);
        
        // 設(shè)置對(duì)齊方式
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        
        return style;
    }
    
    /**
     * 填充數(shù)據(jù)
     */
    private void fillData(SXSSFSheet sheet, List<DataDTO> dataList) {
        CellStyle dataStyle = createDataCellStyle(sheet.getWorkbook());
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        
        for (int i = 0; i < dataList.size(); i++) {
            DataDTO data = dataList.get(i);
            Row row = sheet.createRow(i + 1); // +1 跳過表頭行
            
            // ID
            Cell cell0 = row.createCell(0);
            cell0.setCellValue(data.getId());
            cell0.setCellStyle(dataStyle);
            
            // 姓名
            Cell cell1 = row.createCell(1);
            cell1.setCellValue(data.getName());
            cell1.setCellStyle(dataStyle);
            
            // 年齡
            Cell cell2 = row.createCell(2);
            cell2.setCellValue(data.getAge());
            cell2.setCellStyle(dataStyle);
            
            // 郵箱
            Cell cell3 = row.createCell(3);
            cell3.setCellValue(data.getEmail());
            cell3.setCellStyle(dataStyle);
            
            // 創(chuàng)建時(shí)間
            Cell cell4 = row.createCell(4);
            cell4.setCellValue(data.getCreateTime().format(formatter));
            cell4.setCellStyle(dataStyle);
        }
    }
    
    /**
     * 創(chuàng)建數(shù)據(jù)單元格樣式
     */
    private CellStyle createDataCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        
        // 設(shè)置邊框
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        
        // 設(shè)置垂直居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        
        return style;
    }
    
    /**
     * 自動(dòng)調(diào)整列寬
     */
    private void autoSizeColumns(SXSSFSheet sheet) {
        for (int i = 0; i < 5; i++) { // 假設(shè)有5列
            sheet.autoSizeColumn(i);
            // 設(shè)置最小列寬
            sheet.setColumnWidth(i, Math.max(sheet.getColumnWidth(i), 3000));
        }
    }
    
    /**
     * 清理工作簿資源
     */
    private void cleanupWorkbook(SXSSFWorkbook workbook) {
        if (workbook != null) {
            try {
                // 清理臨時(shí)文件
                workbook.dispose();
                workbook.close();
            } catch (IOException e) {
                logger.warn("清理工作簿資源時(shí)發(fā)生異常", e);
            }
        }
    }
}

方案四:環(huán)境配置優(yōu)化

服務(wù)器配置檢查

@Component
public class EnvironmentChecker {
    
    public void checkPoiEnvironment() {
        // 檢查臨時(shí)目錄
        checkTempDirectory();
        
        // 檢查磁盤空間
        checkDiskSpace();
        
        // 檢查內(nèi)存設(shè)置
        checkMemorySettings();
    }
    
    private void checkTempDirectory() {
        String tempDirPath = System.getProperty("java.io.tmpdir");
        File tempDir = new File(tempDirPath);
        
        if (!tempDir.exists() || !tempDir.canWrite()) {
            throw new RuntimeException("臨時(shí)目錄不可用: " + tempDirPath);
        }
        
        // 創(chuàng)建POI專用臨時(shí)目錄
        File poiTempDir = new File(tempDir, "poi-temp");
        if (!poiTempDir.exists()) {
            poiTempDir.mkdirs();
        }
        
        logger.info("POI臨時(shí)目錄: {}", poiTempDir.getAbsolutePath());
    }
    
    private void checkDiskSpace() {
        File tempDir = new File(System.getProperty("java.io.tmpdir"));
        long freeSpace = tempDir.getFreeSpace();
        long minRequiredSpace = 100 * 1024 * 1024; // 100MB
        
        if (freeSpace < minRequiredSpace) {
            throw new RuntimeException("磁盤空間不足,剩余: " + 
                    (freeSpace / (1024 * 1024)) + "MB,需要至少100MB");
        }
        
        logger.info("磁盤剩余空間: {}MB", freeSpace / (1024 * 1024));
    }
    
    private void checkMemorySettings() {
        Runtime runtime = Runtime.getRuntime();
        long maxMemory = runtime.maxMemory();
        long totalMemory = runtime.totalMemory();
        long freeMemory = runtime.freeMemory();
        
        logger.info("JVM內(nèi)存信息 - 最大: {}MB, 已分配: {}MB, 剩余: {}MB",
                maxMemory / (1024 * 1024),
                totalMemory / (1024 * 1024),
                freeMemory / (1024 * 1024));
    }
}

高級(jí)技巧與最佳實(shí)踐

1. 大數(shù)據(jù)量導(dǎo)出優(yōu)化

對(duì)于海量數(shù)據(jù)導(dǎo)出,需要進(jìn)一步優(yōu)化:

public class LargeDataExcelExporter {
    
    /**
     * 大數(shù)據(jù)量分批次導(dǎo)出
     */
    public void exportLargeData(HttpServletResponse response, 
                               DataQuery query, 
                               String fileName) {
        SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 減少內(nèi)存中行數(shù)
        
        try {
            setupResponse(response, fileName);
            SXSSFSheet sheet = workbook.createSheet("數(shù)據(jù)");
            
            int rowNum = 0;
            int batchSize = 1000;
            
            // 創(chuàng)建表頭
            rowNum = createHeader(sheet, rowNum);
            
            // 分批次查詢和寫入
            while (true) {
                List<DataDTO> batchData = dataService.getBatchData(query, batchSize);
                if (batchData.isEmpty()) {
                    break;
                }
                
                rowNum = fillBatchData(sheet, batchData, rowNum);
                
                // 定期清理內(nèi)存
                if (rowNum % 10000 == 0) {
                    System.gc(); // 建議謹(jǐn)慎使用,僅在大數(shù)據(jù)量時(shí)考慮
                }
                
                query.setLastId(batchData.get(batchData.size() - 1).getId());
            }
            
            workbook.write(response.getOutputStream());
            
        } finally {
            cleanupWorkbook(workbook);
        }
    }
}

2. 異常處理與日志記錄

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 處理Excel導(dǎo)出異常
     */
    @ExceptionHandler(NoClassDefFoundError.class)
    @ResponseBody
    public ResponseEntity<Result<?>> handleNoClassDefFoundError(NoClassDefFoundError e) {
        log.error("類定義未找到異常", e);
        
        // 根據(jù)異常信息判斷具體原因
        if (e.getMessage().contains("SXSSFWorkbook")) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Result.error("系統(tǒng)配置異常,請(qǐng)聯(lián)系管理員檢查POI依賴配置"));
        }
        
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(Result.error("系統(tǒng)內(nèi)部錯(cuò)誤"));
    }
    
    /**
     * 處理所有導(dǎo)出相關(guān)異常
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseEntity<Result<?>> handleExportException(Exception e) {
        log.error("導(dǎo)出操作異常", e);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(Result.error("導(dǎo)出失敗,請(qǐng)稍后重試"));
    }
}

測(cè)試與驗(yàn)證

單元測(cè)試示例

@SpringBootTest
class ExcelExportServiceTest {
    
    @Autowired
    private ExcelExportService excelExportService;
    
    @Test
    void testExportWorkbookCreation() {
        // 測(cè)試工作簿創(chuàng)建
        assertDoesNotThrow(() -> {
            SXSSFWorkbook workbook = excelExportService.createWorkbook();
            assertNotNull(workbook);
            workbook.dispose();
            workbook.close();
        });
    }
    
    @Test
    void testDependencies() {
        // 驗(yàn)證必要的類是否可加載
        assertDoesNotThrow(() -> {
            Class.forName("org.apache.poi.xssf.streaming.SXSSFWorkbook");
            Class.forName("org.apache.poi.ss.usermodel.Workbook");
            Class.forName("org.apache.poi.util.TempFile");
        });
    }
}

總結(jié)

通過本文的詳細(xì)分析,我們了解到NoClassDefFoundError: Could not initialize class org.apache.poi.xssf.streaming.SXSSFWorkbook錯(cuò)誤的復(fù)雜性和多樣性。解決這個(gè)問題需要從依賴管理、環(huán)境配置、代碼實(shí)現(xiàn)等多個(gè)角度綜合考慮。

關(guān)鍵要點(diǎn)總結(jié):

  • 依賴完整性:確保所有必要的POI模塊和傳遞依賴都正確引入
  • 版本一致性:避免不同模塊間的版本沖突
  • 環(huán)境準(zhǔn)備:確保服務(wù)器有足夠的磁盤空間和正確的文件權(quán)限
  • 資源管理:正確初始化和清理SXSSFWorkbook資源
  • 異常處理:建立完善的異常處理機(jī)制,提供友好的用戶提示

通過遵循本文提供的解決方案和最佳實(shí)踐,開發(fā)者可以有效避免和解決SXSSFWorkbook初始化失敗的問題,構(gòu)建穩(wěn)定可靠的Excel導(dǎo)出功能。

到此這篇關(guān)于Apache POI導(dǎo)出Excel遇NoClassDefFoundError的原因分析與解決方案的文章就介紹到這了,更多相關(guān)NoClassDefFoundError錯(cuò)誤解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于java解析JSON的三種方式詳解

    基于java解析JSON的三種方式詳解

    這篇文章主要介紹了基于java解析JSON的三種方式,結(jié)合實(shí)例形式詳細(xì)分析了json解析的原理與GSON、FastJSON等常用解析操作技巧,需要的朋友可以參考下
    2016-12-12
  • Java實(shí)現(xiàn)samza轉(zhuǎn)換成flink

    Java實(shí)現(xiàn)samza轉(zhuǎn)換成flink

    將Apache Samza作業(yè)遷移到Apache Flink作業(yè)是一個(gè)復(fù)雜的任務(wù),因?yàn)檫@兩個(gè)流處理框架有不同的API和架構(gòu),本文我們就來看看如何使用Java實(shí)現(xiàn)samza轉(zhuǎn)換成flink吧
    2024-11-11
  • 淺析java中的取整(/)和求余(%)

    淺析java中的取整(/)和求余(%)

    這篇文章主要介紹了淺析java中的取整(/)和求余(%),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java中synchronized鎖的升級(jí)過程

    java中synchronized鎖的升級(jí)過程

    這篇文章主要介紹了java中synchronized鎖的升級(jí)過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • springBoot mybatis 包掃描實(shí)例

    springBoot mybatis 包掃描實(shí)例

    這篇文章主要介紹了springBoot mybatis 包掃描實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java設(shè)計(jì)模式之工廠模式案例詳解

    Java設(shè)計(jì)模式之工廠模式案例詳解

    工廠模式(Factory Pattern)是Java中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。本文將通過案例詳細(xì)講解一下工廠模式,需要的可以參考一下
    2022-02-02
  • Java跨域問題分析與解決方法詳解

    Java跨域問題分析與解決方法詳解

    這篇文章主要介紹了Java跨域問題分析與解決方法,跨域問題是在Web應(yīng)用程序中,由于同源策略的限制,導(dǎo)致瀏覽器無法發(fā)送跨域請(qǐng)求,也無法獲取跨域響應(yīng)的問題,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • Spring接口ApplicationRunner用法詳解

    Spring接口ApplicationRunner用法詳解

    這篇文章主要介紹了Spring接口ApplicationRunner的作用和使用介紹,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Springboot啟動(dòng)執(zhí)行特定代碼的方式匯總

    Springboot啟動(dòng)執(zhí)行特定代碼的方式匯總

    這篇文章主要介紹了Springboot啟動(dòng)執(zhí)行特定代碼的幾種方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • java讀取csv文件內(nèi)容示例代碼

    java讀取csv文件內(nèi)容示例代碼

    這篇文章主要介紹了java讀取csv文件內(nèi)容的示例,大家參考使用
    2013-12-12

最新評(píng)論

山阳县| 封丘县| 行唐县| 得荣县| 陆川县| 富宁县| 腾冲县| 贵南县| 额济纳旗| 上思县| 大英县| 阿图什市| 嘉鱼县| 大埔县| 龙川县| 鲁山县| 石城县| 柘荣县| 蛟河市| 杭锦旗| 汽车| 成安县| 乐东| 兴隆县| 本溪| 泾川县| 台中市| 延川县| 老河口市| 平原县| 东乡| 安顺市| 南京市| 孟连| 汉寿县| 万荣县| 长白| 通城县| 邯郸市| 临朐县| 汉阴县|