SpringBoot整合POI實(shí)現(xiàn)Excel文件讀寫操作

https://blog.csdn.net/qq_46921028/article/details/133631309?spm=1001.2014.3001.5501

1.環(huán)境準(zhǔn)備

1、導(dǎo)入sql腳本:

create database if not exists springboot default charset utf8mb4;

use springboot;

create table if not exists `user`

(

? ? `id`? ? ? bigint(20) primary key auto_increment comment '主鍵id',

? ? `username` varchar(255)? not null comment '用戶名',

? ? `sex`? ? ? char(1)? ? ? ? not null comment '性別',

? ? `phone`? ? varchar(22)? ? not null comment '手機(jī)號(hào)',

? ? `city`? ? varchar(255)? not null comment '所在城市',

? ? `position` varchar(255)? not null comment '職位',

? ? `salary`? decimal(18, 2) not null comment '工資:長度18位,保留2位小數(shù)'

) engine InnoDB comment '用戶表';

INSERT INTO `user` (`username`, `sex`, `phone`, `city`, `position`, `salary`) VALUES

('張三', '男', '13912345678', '北京', '軟件工程師', 10000.00),

('李四', '女', '13723456789', '上海', '數(shù)據(jù)分析師', 12000.00),

('王五', '男', '15034567890', '廣州', '產(chǎn)品經(jīng)理', 15000.00),

('趙六', '女', '15145678901', '深圳', '前端工程師', 11000.00),

('劉七', '男', '15856789012', '成都', '測(cè)試工程師', 9000.00),

('陳八', '女', '13967890123', '重慶', 'UI設(shè)計(jì)師', 8000.00),

('朱九', '男', '13778901234', '武漢', '運(yùn)維工程師', 10000.00),

('楊十', '女', '15089012345', '南京', '數(shù)據(jù)工程師', 13000.00),

('孫十一', '男', '15190123456', '杭州', '后端工程師', 12000.00),

('周十二', '女', '15801234567', '天津', '產(chǎn)品設(shè)計(jì)師', 11000.00);

2、創(chuàng)建springboot工程 (springboot版本為2.7.13)

3、引入依賴:

<dependencies>

? ? <dependency>

? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? <artifactId>spring-boot-starter-web</artifactId>

? ? </dependency>

? ? <dependency>

? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? <artifactId>spring-boot-test</artifactId>

? ? </dependency>

? ? <dependency>

? ? ? ? <groupId>org.projectlombok</groupId>

? ? ? ? <artifactId>lombok</artifactId>

? ? </dependency>

<dependency>

? ? ? ? <groupId>mysql</groupId>

? ? ? ? <artifactId>mysql-connector-java</artifactId>

? ? ? ? <version>8.0.13</version>

? ? </dependency>

? ? <dependency>

? ? ? ? <groupId>com.baomidou</groupId>

? ? ? ? <artifactId>mybatis-plus-boot-starter</artifactId>

? ? ? ? <version>3.5.2</version>

? ? </dependency>

</dependencies>

4、修改yml配置:

server:

? port: 8001

# 數(shù)據(jù)庫配置

spring:

? datasource:

? ? driver-class-name: com.mysql.cj.jdbc.Driver

? ? url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true

? ? username: root

? ? password: 123456

# mybatisplus配置

mybatis-plus:

? mmapper-locations: classpath:mapper/*.xml #mapper文件存放路徑

? type-aliases-package: cn.z3inc.exceldemo.entity # 類型別名(實(shí)體類所在包)

? configuration:

? ? log-impl: org.apache.ibatis.logging.stdout.StdOutImpl? #配置標(biāo)準(zhǔn)sql輸出

5培廓、使用?MyBatisPlus?插件生成基礎(chǔ)代碼:

①?配置數(shù)據(jù)庫

② 使用代碼生成器生成代碼:

2. POI

Excel報(bào)表的兩種方式:

在企業(yè)級(jí)應(yīng)用開發(fā)中,Excel報(bào)表是一種常見的報(bào)表需求,Excel報(bào)表開發(fā)一般分為兩種形式:

把Excel中的數(shù)據(jù)導(dǎo)入到系統(tǒng)中憔儿;(上傳)

通過Java代碼生成Excel報(bào)表。(下載)

Excel版本:

目前世面上的Excel分為兩個(gè)大版本:Excel2003 和 Excel2007及以上版本放可;

Excel2003是一個(gè)特有的二進(jìn)制格式谒臼,其核心結(jié)構(gòu)是復(fù)合文檔類型的結(jié)構(gòu),存儲(chǔ)數(shù)據(jù)量較幸铩蜈缤;Excel2007 的核心結(jié)構(gòu)是 XML 類型的結(jié)構(gòu),采用的是基于 XML 的壓縮方式冯挎,使其占用的空間更小底哥,操作效率更高。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Excel 2003? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Excel 2007

后綴? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xls? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?xlsx

結(jié)構(gòu)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 二進(jìn)制格式房官,其核心結(jié)構(gòu)是復(fù)合文檔類型的結(jié)構(gòu)? ? ? ? ?XML類型結(jié)構(gòu)

單sheet數(shù)據(jù)量(sheet趾徽,工作表)表格共有65536行,256列? ? ? ? ? ? ?表格共有1048576行翰守,16384列

特點(diǎn)存儲(chǔ)容量有限? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?基于xml壓縮孵奶,占用空間小,操作效率高

Apache POI:

Apache POI(全稱:Poor Obfuscation Implementation)潦俺,是Apache軟件基金會(huì)的一個(gè)開源項(xiàng)目拒课,它提供了一組API徐勃,可以讓Java程序讀寫 Microsoft Office 格式的文件,包括 word早像、excel僻肖、ppt等。

Apache POI是目前最流行的操作Microsoft Office的API組件卢鹦,借助POI可以為工作提高效率,如 數(shù)據(jù)報(bào)表生成臀脏,數(shù)據(jù)批量上傳,數(shù)據(jù)備份等工作冀自。

官網(wǎng)地址:https://poi.apache.org/

POI針對(duì)Excel的API如下:

Workbook:工作薄揉稚,Excel的文檔對(duì)象,針對(duì)不同的Excel類型分為:HSSFWorkbook(2003)和XSSFWorkbook(2007);

Sheet:Excel的工作單(表)熬粗;

Row:Excel的行搀玖;

Cell:Excel的格子,單元格驻呐。

Java中常用的excel報(bào)表工具有:POI灌诅、easyexcel、easypoi等含末。

POI快速入門:

引入POI依賴:

<!--excel POI依賴-->

<dependency>

? ? <groupId>org.apache.poi</groupId>

? ? <artifactId>poi</artifactId>

? ? <version>4.0.1</version>

</dependency>

<dependency>

? ? <groupId>org.apache.poi</groupId>

? ? <artifactId>poi-ooxml</artifactId>

? ? <version>4.0.1</version>

</dependency>

<dependency>

? ? <groupId>org.apache.poi</groupId>

? ? <artifactId>poi-ooxml-schemas</artifactId>

? ? <version>4.0.1</version>

</dependency>

示例1:批量寫操作(大數(shù)據(jù)量時(shí)會(huì)出現(xiàn)內(nèi)存異常問題)

寫入excel文件步驟:

創(chuàng)建工作簿:workbook

創(chuàng)建工作表:sheet

創(chuàng)建行:row

創(chuàng)建列(單元格):cell

具體數(shù)據(jù)寫入

package cn.z3inc.exceldemo.controller;

import cn.z3inc.exceldemo.entity.User;

import cn.z3inc.exceldemo.service.IUserService;

import lombok.RequiredArgsConstructor;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import org.springframework.web.bind.annotation.CrossOrigin;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletResponse;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.List;

/**

* <p>

* 用戶表 前端控制器

* </p>

*

* @author 白豆五

* @since 2023-10-01

*/

@CrossOrigin

@RestController

@RequiredArgsConstructor

@RequestMapping("/user")

public class UserController {

private final IUserService userService;

/**

? ? * 導(dǎo)出excel

? ? */

? ? @RequestMapping("/export")

? ? public void exportExcel(HttpServletResponse response) throws IOException {

? ? ? ? // 1. 創(chuàng)建excel工作簿(workbook):excel2003使用HSSF,excel2007使用XSSF,excel2010使用SXSSF(大數(shù)據(jù)量)

? ? ? ? XSSFWorkbook workbook = new XSSFWorkbook();

// 2. 創(chuàng)建excel工作表(sheet)?

?Sheet sheet = workbook.createSheet("用戶表");

// 3. 在表中創(chuàng)建標(biāo)題行(row): 表頭

?Row titleRow = sheet.createRow(0); // 通過索引表示行,0表示第一行

// 4. 在標(biāo)題行中創(chuàng)建7個(gè)單元格 且 為每個(gè)單元格設(shè)置內(nèi)容數(shù)據(jù)

? ? ? ? String[] titleArr = {"用戶ID", "姓名", "性別", "電話", "所在城市", "職位", "薪資"};

? ? ? ? for (int i = 0; i < titleArr.length; i++) {

? ? ? ? ? ? Cell cell = titleRow.createCell(i); //設(shè)置單元格的位置,從0開始

? ? ? ? ? ? cell.setCellValue(titleArr[i]); // 為單元格填充數(shù)據(jù)

? ? ? ? }

// 5. 查詢所有用戶數(shù)據(jù) List<User> userList = userService.list();

// 6. 遍歷用戶list,獲取每個(gè)用戶,并填充每一行單元格的數(shù)據(jù)

? ? ? ? for (int i = 0; i < userList.size(); i++) {

? ? ? ? ? ? User user = userList.get(i);

? ? ? ? ? ? // 創(chuàng)建excel的行

? ? ? ? ? ? Row row = sheet.createRow(i+1); // 從第二行開始,索引為1

? ? ? ? ? ? // 為每個(gè)單元格填充數(shù)據(jù)

? ? ? ? ? ? row.createCell(0).setCellValue(user.getId());

? ? ? ? ? ? row.createCell(1).setCellValue(user.getUsername());

? ? ? ? ? ? row.createCell(2).setCellValue(user.getSex());

? ? ? ? ? ? row.createCell(3).setCellValue(user.getPhone());

? ? ? ? ? ? row.createCell(4).setCellValue(user.getCity());

? ? ? ? ? ? row.createCell(5).setCellValue(user.getPosition());

? ? ? ? ? ? row.createCell(6).setCellValue(user.getSalary().doubleValue());

? ? ? ? }

// 7. 輸出文件

? ? ? ? // 7.1 把excel文件寫到磁盤上

? ? ? ? FileOutputStream outputStream = new FileOutputStream("d:/1.xlsx");

? ? ? ? workbook.write(outputStream); // 把excel寫到輸出流中

? ? ? ? outputStream.close(); // 關(guān)閉流

? ? ? ? // 7.2 把excel文件輸出到瀏覽器上

? ? ? ? // 設(shè)置響應(yīng)頭信息

? ? ? ? response.setContentType("application/vnd.ms-excel");

? ? ? ? response.setHeader("Content-Disposition", "attachment; filename=1.xlsx");

? ? ? ? ServletOutputStream servletOutputStream = response.getOutputStream();

? ? ? ? workbook.write(servletOutputStream);

? ? ? ? servletOutputStream.flush(); // 刷新緩沖區(qū)

? ? ? ? servletOutputStream.close(); // 關(guān)閉流

? ? ? ? workbook.close();

? ? }

}

示例2:大數(shù)量寫操作

/**

* 大數(shù)據(jù)量批量導(dǎo)出excel:SXSSF(同樣兼容XSSF)

* 官方提供了SXSSF來解決大文件寫入問題,它可以寫入非常大量的數(shù)據(jù)猜拾,比如上百萬條數(shù)據(jù),并且寫入速度更快佣盒,占用內(nèi)存更少

* SXSSF在寫入數(shù)據(jù)時(shí)會(huì)將數(shù)據(jù)分批寫入硬盤(會(huì)產(chǎn)生臨時(shí)文件)挎袜,而不是一次性將所有數(shù)據(jù)寫入硬盤。

* SXSSF通過滑動(dòng)窗口限制內(nèi)存讀取的行數(shù)(默認(rèn)100行,超過100行就會(huì)寫入磁盤)肥惭,而XSSF將文檔中所有行加載到內(nèi)存中盯仪。那些不在滑動(dòng)窗口中的數(shù)據(jù)是不能訪問的,因?yàn)樗鼈円呀?jīng)被寫到磁盤上了务豺。這樣可以節(jié)省大量內(nèi)存空間 磨总。

*/

@RequestMapping("/export2")

public void exportExcel2(HttpServletResponse response) throws IOException {

long star = System.currentTimeMillis();

? ? // 1. 創(chuàng)建excel工作簿(workbook):SXSSFWorkbook

? ? SXSSFWorkbook workbook = new SXSSFWorkbook();//默認(rèn)窗口大小為100

? ? // 2. 創(chuàng)建excel工作表(sheet)

? ? Sheet sheet = workbook.createSheet("用戶表");

// 3. 在表中創(chuàng)建標(biāo)題行(row): 表頭

? ? Row titleRow = sheet.createRow(0); // 通過索引表示行,0表示第一行

? ? // 4. 在標(biāo)題行中創(chuàng)建7個(gè)單元格 且 為每個(gè)單元格設(shè)置內(nèi)容數(shù)據(jù)

? ? String[] titleArr = {"用戶ID", "姓名", "性別", "電話", "所在城市", "職位", "薪資"};

? ? for (int i = 0; i < titleArr.length; i++) {

? ? ? ? Cell cell = titleRow.createCell(i); //設(shè)置單元格的位置,從0開始

? ? ? ? cell.setCellValue(titleArr[i]); // 為單元格填充數(shù)據(jù)

? ? }

// 5. 查詢所有用戶數(shù)據(jù)

? ? List<User> userList = userService.list();

? ? // 6. 遍歷用戶list,獲取每個(gè)用戶,并填充每一行單元格的數(shù)據(jù)

? ? for (int i = 0; i < 65536; i++) {

? ? ? ? User user;

? ? ? ? if (i > userList.size() - 1) {

? ? ? ? ? ? user = userList.get(userList.size() - 1);

? ? ? ? } else {

? ? ? ? ? ? user = userList.get(i);

? ? ? ? }

// 創(chuàng)建excel的行

? ? ? ? Row row = sheet.createRow(i + 1); // 從第二行開始,索引為1

? ? ? ? // 為每個(gè)單元格填充數(shù)據(jù)

? ? ? ? row.createCell(0).setCellValue(user.getId());

? ? ? ? row.createCell(1).setCellValue(user.getUsername());

? ? ? ? row.createCell(2).setCellValue(user.getSex());

? ? ? ? row.createCell(3).setCellValue(user.getPhone());

? ? ? ? row.createCell(4).setCellValue(user.getCity());

? ? ? ? row.createCell(5).setCellValue(user.getPosition());

? ? ? ? row.createCell(6).setCellValue(user.getPosition());

? ? }

// 7. 輸出文件

? ? // 7.1 把excel文件寫到磁盤上

? ? FileOutputStream outputStream = new FileOutputStream("d:/2.xlsx");

? ? workbook.write(outputStream); // 把excel寫到輸出流中

? ? outputStream.close(); // 關(guān)閉流

? ? workbook.close();

? ? long end = System.currentTimeMillis();

? ? log.info("大數(shù)據(jù)量批量數(shù)據(jù)寫入用時(shí): {} ms", end - star);

}

經(jīng)測(cè)試XSSF大概十秒左右輸出excel文件嗦明,而SXSSF一秒左右輸出excel文件笼沥。

示例:讀取excel文件

讀取excel文件步驟:(通過文件流讀取)

獲取工作簿

獲取工作表(sheet)

獲取行(row)

獲取單元格(cell)

讀取數(shù)據(jù)

// 讀取excel文件

@RequestMapping("/upload")

public void readExcel(MultipartFile file) {

? ? InputStream is = null;

? ? XSSFWorkbook workbook = null;

? ? try {

? ? ? ? // 1. 創(chuàng)建excel工作簿(workbook)

? ? ? ? is = file.getInputStream();

? ? ? ? workbook = new XSSFWorkbook(is);

// 2. 獲取要解析的工作表(sheet)?

?Sheet sheet = workbook.getSheetAt(0); // 獲取第一個(gè)sheet

// 3. 獲取表格中的每一行娶牌,排除表頭奔浅,從第二行開始

? ? ? ? User user;

? ? ? ? List<User> list = new ArrayList<>();

? ? ? ? for (int i = 1; i <= sheet.getLastRowNum(); i++) {

? ? ? ? ? ? Row row = sheet.getRow(i); // 獲取第i行

? ? ? ? ? ? // 4. 獲取每一行的每一列,并為user對(duì)象的屬性賦值,添加到list集合中

? ? ? ? ? ? user = new User();

? ? ? ? ? ? user.setUsername(row.getCell(1).getStringCellValue());

? ? ? ? ? ? user.setSex(row.getCell(2).getStringCellValue());

? ? ? ? ? ? user.setPhone(row.getCell(3).getStringCellValue());

? ? ? ? ? ? user.setCity(row.getCell(4).getStringCellValue());

? ? ? ? ? ? user.setPosition(row.getCell(5).getStringCellValue());

? ? ? ? ? ? user.setSalary(new BigDecimal(row.getCell(6).getNumericCellValue()));

? ? ? ? ? ? list.add(user);

? ? ? ? }

// 5. 批量保存

? ? ? ? userService.saveBatch(list);

? ? } catch (IOException e) {

? ? ? ? e.printStackTrace();

? ? ? ? throw new RuntimeException("批量導(dǎo)入失敗");

? ? } finally {

? ? ? ? try {

? ? ? ? ? ? if (is != null) {

? ? ? ? ? ? ? ? is.close();

? ? ? ? ? ? }

? ? ? ? ? ? if (workbook != null) {

? ? ? ? ? ? ? ? workbook.close();

? ? ? ? ? ? }

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? throw new RuntimeException("批量導(dǎo)入失敗");

? ? ? ? }

? ? }

}

3. EasyExcel

EasyExcel是一個(gè)基于Java的诗良、快速汹桦、簡潔、解決大文件內(nèi)存溢出的Excel處理工具鉴裹。他能讓你在不用考慮性能舞骆、內(nèi)存的等因素的情況下钥弯,快速完成Excel的讀、寫等功能督禽。

官網(wǎng)地址:https://easyexcel.opensource.alibaba.com/

文檔地址:https://easyexcel.opensource.alibaba.com/docs/current/

示例代碼:https://github.com/alibaba/easyexcel/tree/master/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo

pom依賴:

<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->

<dependency>

? ? <groupId>com.alibaba</groupId>

? ? <artifactId>easyexcel</artifactId>

? ? <version>3.2.1</version>

</dependency>

最后脆霎,EasyExcel的官方文檔非常全面,我就不一一贅述了狈惫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睛蛛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胧谈,更是在濱河造成了極大的恐慌忆肾,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菱肖,死亡現(xiàn)場(chǎng)離奇詭異客冈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)稳强,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門郊酒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人键袱,你說我怎么就攤上這事燎窘。” “怎么了蹄咖?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵褐健,是天一觀的道長。 經(jīng)常有香客問我澜汤,道長蚜迅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任俊抵,我火速辦了婚禮谁不,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徽诲。我一直安慰自己刹帕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布谎替。 她就那樣靜靜地躺著偷溺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钱贯。 梳的紋絲不亂的頭發(fā)上挫掏,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音秩命,去河邊找鬼尉共。 笑死褒傅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袄友。 我是一名探鬼主播樊卓,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼杠河!你這毒婦竟也來了碌尔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤券敌,失蹤者是張志新(化名)和其女友劉穎唾戚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體待诅,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叹坦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卑雁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片募书。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖测蹲,靈堂內(nèi)的尸體忽然破棺而出莹捡,到底是詐尸還是另有隱情,我是刑警寧澤扣甲,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布篮赢,位于F島的核電站,受9級(jí)特大地震影響琉挖,放射性物質(zhì)發(fā)生泄漏启泣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一示辈、第九天 我趴在偏房一處隱蔽的房頂上張望寥茫。 院中可真熱鬧,春花似錦矾麻、人聲如沸纱耻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膝迎。三九已至,卻和暖如春胰耗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芒涡。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工柴灯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卖漫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓赠群,卻偏偏與公主長得像羊始,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子查描,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容