Java實(shí)現(xiàn)快速將HTML表格轉(zhuǎn)換成Excel
背景
隨著后疫情時(shí)代的到來,在過去的2022年,全國(guó)的經(jīng)濟(jì)情況,想必是很多學(xué)者和研究對(duì)象都非常關(guān)心的事。而這些數(shù)據(jù)在國(guó)家統(tǒng)計(jì)局網(wǎng)站上都有相應(yīng)的記錄。通過分析這些數(shù)據(jù),可以從某一個(gè)角度來驗(yàn)證和觀察當(dāng)下的經(jīng)濟(jì)情況。
全國(guó)共計(jì)有1279個(gè)縣級(jí)單位已經(jīng)披露了2022年GDP和一般公共預(yù)算收入數(shù)據(jù)情況,企業(yè)預(yù)警通根據(jù)這些數(shù)據(jù)整理出中國(guó)百?gòu)?qiáng)縣gdp排行榜和百?gòu)?qiáng)縣一般公共預(yù)算收入排行榜。其中昆山市以5006.66億元GDP蟬聯(lián)榜單榜首,江陰市、晉江市位列百?gòu)?qiáng)縣第二三位,長(zhǎng)沙縣是湖南省唯一進(jìn)入全國(guó)前十的(Top7)。來源:2023中國(guó)縣城GDP百?gòu)?qiáng)榜揭曉 2023中國(guó)百?gòu)?qiáng)縣排行榜一覽。


第一張圖是以圖片的形式發(fā)布的,第二種是采用Html的表格(table)形式展示的。在離線分析使用數(shù)據(jù)的時(shí)候非常不方便。作為程序猿,這一定難不倒您。我們可以采用網(wǎng)頁(yè)抓取的技術(shù)對(duì)數(shù)據(jù)進(jìn)行整理。本文將以Java語(yǔ)言為編程語(yǔ)言,講解使用Jsoup對(duì)Web網(wǎng)頁(yè)知識(shí)進(jìn)行爬取,文中給出了詳細(xì)的示例代碼,希望對(duì)大家有幫助。
一、初識(shí)Jsoup抓取
網(wǎng)頁(yè)結(jié)構(gòu)分析
在使用Jsoup對(duì)頁(yè)面進(jìn)行抓取時(shí),需要對(duì)網(wǎng)頁(yè)的結(jié)構(gòu)進(jìn)行初步的分析,便于制定相對(duì)應(yīng)的抓取策略。首先打開瀏覽器,輸入目標(biāo)網(wǎng)站的地址,同時(shí)打開F12進(jìn)入調(diào)試,找到目標(biāo)網(wǎng)頁(yè)的元素。

打開上面gdp百?gòu)?qiáng)榜表格中的div下table表格,找到如下的數(shù)據(jù)

同理,對(duì)于一般公共預(yù)算收入的數(shù)據(jù)處理也是同樣的處理辦法,在此不再贅述。
二、Java開發(fā)Jsoup抓取
1、引用Jsoup相關(guān)依賴包
這里我們采用Maven的jar進(jìn)行包的依賴處理管理。因此先定義Pom.xml,關(guān)鍵代碼如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yelang</groupId> <artifactId>jsoupdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> </dependency> </dependencies> </project>
2、信息實(shí)體類的處理
對(duì)比發(fā)現(xiàn)兩個(gè)表格處理具體的指標(biāo)不一樣,前面的排名和縣名稱,所在省份名稱都是一樣的。因此我們采用面向?qū)ο蟮脑O(shè)計(jì)方法對(duì)信息處理的類進(jìn)行開發(fā)。相應(yīng)的類圖如下所示:

3、數(shù)據(jù)采集實(shí)體
package com.yelang.entity;
import java.io.Serializable;
import com.alibaba.excel.annotation.ExcelProperty;
public class CountyBase implements Serializable {
private static final long serialVersionUID = -1760099890427975758L;
@ExcelProperty(value= {"序號(hào)"},index = 1)
private Integer index;
@ExcelProperty(value= {"縣級(jí)地區(qū)"},index = 2)
private String name;
@ExcelProperty(value= {"所屬省"},index = 3)
private String province;
public Integer getIndex() {
return index;
}
public void setIndex(Integer index) {
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public CountyBase(Integer index, String name, String province) {
super();
this.index = index;
this.name = name;
this.province = province;
}
public CountyBase() {
super();
}
}在上面的代碼中,將排序、縣級(jí)地區(qū)、省作為父類抽象出來,設(shè)計(jì)兩個(gè)子類:GDP類和一般公共收入類。這里需要注意的是,由于這里我們需要將采集的數(shù)據(jù)保存到本地的Excel表格中,這里我們采用EasyExcel作為技術(shù)生成組件。@ExcelProperty這個(gè)屬性中,我們定義了寫入的Excel表頭以及具體的排序。
package com.yelang.entity;
import java.io.Serializable;
import com.alibaba.excel.annotation.ExcelProperty;
public class Gdp extends CountyBase implements Serializable {
private static final long serialVersionUID = 5265057372502768147L;
@ExcelProperty(value= {"GDP(億元)"},index = 4)
private String gdp;
public String getGdp() {
return gdp;
}
public void setGdp(String gdp) {
this.gdp = gdp;
}
public Gdp(Integer index, String name, String province, String gdp) {
super(index,name,province);
this.gdp = gdp;
}
public Gdp(Integer index, String name, String province) {
super(index, name, province);
}
}package com.yelang.entity;
import java.io.Serializable;
import com.alibaba.excel.annotation.ExcelProperty;
public class Gpbr extends CountyBase implements Serializable {
private static final long serialVersionUID = 8612514686737317620L;
@ExcelProperty(value= {"一般公共預(yù)算收入(億元)"},index = 4)
private String gpbr;// General public budget revenue
public String getGpbr() {
return gpbr;
}
public void setGpbr(String gpbr) {
this.gpbr = gpbr;
}
public Gpbr(Integer index, String name, String province, String gpbr) {
super(index, name, province);
this.gpbr = gpbr;
}
public Gpbr(Integer index, String name, String province) {
super(index, name, province);
}
}4、實(shí)際爬取
下面是處理GDP數(shù)據(jù)的轉(zhuǎn)換代碼,如果不熟悉Jsoup可以先熟悉下相關(guān)語(yǔ)法,如果有類似Jquery的開發(fā)經(jīng)驗(yàn),對(duì)于Jsoup上手非???。
static void grabGdp() {
String target = "https://www.maigoo.com/news/665462.html";
try {
Document doc = Jsoup.connect(target)
.ignoreContentType(true)
.userAgent(FetchCsdnCookie.ua[1])
.timeout(300000)
.header("referer","https://www.maigoo.com")
.get();
Elements elements = doc.select("#t_container > div:eq(3) table tr");
List<Gdp> list = new ArrayList<Gdp>();
for(int i = 1;i<elements.size();i++) {
Element tr = elements.get(i);//獲取表頭
Elements tds = tr.select("td");
Integer index = Integer.valueOf(tds.get(0).text());
String name = tds.get(1).text();
String province = tds.get(2).text();
String gdp = tds.get(3).text();
Gdp county = new Gdp(index, name, province, gdp);
list.add(county);
}
String fileName = "E:/gdptest/2023全國(guó)百?gòu)?qiáng)縣GDP排行榜 .xlsx";
EasyExcel.write(fileName, Gdp.class).sheet("GDP百?gòu)?qiáng)榜").doWrite(list);
System.out.println("完成...");
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println("發(fā)生異常,繼續(xù)下一輪循環(huán)");
}
}這里需要注意的是在jsoup中如何進(jìn)行網(wǎng)頁(yè)的元素定位及抓取。在上面這里,我們使用類似jquery的Dom獲取方法。
Elements elements = doc.select("#t_container > div:eq(3) table tr");通過這一行去獲取表格下的每一個(gè)tr,然后再循環(huán)每個(gè)td就可以獲取對(duì)應(yīng)的數(shù)據(jù)。
三、過程分析及結(jié)果
1、采集過程分析
這里采用對(duì)源程序進(jìn)行debug的方法對(duì)網(wǎng)頁(yè)進(jìn)行抽絲剝繭的分析。使用jsou進(jìn)行網(wǎng)頁(yè)模擬訪問

采用select(xxx)的方法獲取頁(yè)面元素,

獲取tr下的td單元格數(shù)據(jù),

2、運(yùn)行結(jié)果
上述代碼運(yùn)行完成后,在目的磁盤可以看到以下兩個(gè)文件,

打開上述兩個(gè)excel文件可以看到想要采集的數(shù)據(jù)已經(jīng)采集完畢,數(shù)據(jù)的順序也是完全按照網(wǎng)頁(yè)上的順序來進(jìn)行生成的。


總結(jié)
本文以Java語(yǔ)言為編程語(yǔ)言,詳細(xì)講解了如何使用Jsoup對(duì)Web網(wǎng)頁(yè)知識(shí)進(jìn)行爬取,結(jié)合EasyExcel將網(wǎng)頁(yè)表格轉(zhuǎn)換成Excel表格,同時(shí)文中給出了詳細(xì)的示例代碼。由于行文倉(cāng)促,難免有誤,歡迎批評(píng)指正交流。
以上就是Java實(shí)現(xiàn)快速將HTML表格轉(zhuǎn)換成Excel的詳細(xì)內(nèi)容,更多關(guān)于Java HTML表格轉(zhuǎn)Excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合MyCat實(shí)現(xiàn)讀寫分離的方法
這篇文章主要介紹了SpringBoot整合MyCat實(shí)現(xiàn)讀寫分離的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
windows系統(tǒng)上如何進(jìn)行maven安裝和配置方式
這篇文章主要介紹了windows系統(tǒng)上如何進(jìn)行maven安裝和配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05
java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換
很多人表示,java將string類型轉(zhuǎn)為date類型不知道應(yīng)該怎樣做,本文就來介紹一下java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
一篇文章帶你認(rèn)識(shí)Java8接口的默認(rèn)方法
這篇文章主要給大家介紹了如何通過一篇文章帶你認(rèn)識(shí)Java8接口的默認(rèn)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
基于java中byte數(shù)組與int類型的轉(zhuǎn)換(兩種方法)
下面小編就為大家?guī)硪黄趈ava中byte數(shù)組與int類型的轉(zhuǎn)換(兩種方法)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08

