Apache H/XSSFWorkbook創(chuàng)建Excel實例

效果圖1
效果圖2
效果圖3
效果圖4

說明:

實現(xiàn)各種各樣樣式的Excel缓屠,是我們在開發(fā)中比較頭疼的事情砸喻,下面這個例子夜涕,是通過java語言,運用Apache HSSFWorkbook創(chuàng)建Excel的實現(xiàn)壁肋,可滿足大多數(shù)的場景(XSSFWorkbook同理)号胚。

一、Excel生成

1浸遗、Excel生成服務

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ExcelReportMakerService {
  
  @Autowired
  private DOssClient ossClient;
  
  @Value(value = "${dpos-service.excel.excelReport.fontName:宋體}")
  private String fontName;
  
  @Value(value = "${dpos-service.excel.excelReport.titleSize:25}")
  private int titleSize;
  
  @Value(value = "${dpos-service.excel.excelReport.subTitleSize:18}")
  private int subTitleSize;
  
  @Value(value = "${dpos-service.excel.excelReport.columnWidth:120}")
  private int columnWidth;
  
  public String make(ExcelReport excelReport) throws Exception {
    
    // 第一步創(chuàng)建workbook
    HSSFWorkbook workbook = new HSSFWorkbook();
    // 第二步創(chuàng)建sheet
    HSSFSheet sheet = workbook.createSheet(excelReport.getSheet());

    // 1猫胁、聲明一個工作薄
    // 2、生成一個表格
    List<List<Cell>> data = excelReport.getList();
    int num = data.get(0).size();
    sheet.setDefaultColumnWidth(columnWidth/num);
    sheet.setDisplayGridlines(false); // 去除excel原有的空白白色邊框

    int offset = 0;
    createTitle(new ExcelReport.ExcelTitle(workbook, sheet, excelReport.getTitle(), num, titleSize, offset++, HSSFCellStyle.ALIGN_CENTER));
    if (excelReport.getSubTitle() != null) {
      createTitle(new ExcelReport.ExcelTitle(workbook, sheet, excelReport.getSubTitle(), num, subTitleSize, offset++, HSSFCellStyle.ALIGN_LEFT));
    }
    fillData(workbook, sheet, data, offset);
   
    String urlPath = uploadExcel(workbook, excelReport.getShop(), excelReport.getFileName());
    return urlPath;

  }
  
  public void createTitle(ExcelTitle excelTitle) {
    // 設置行的字體樣式 ----------------------------------字體------------------------
    HSSFFont firstFont = excelTitle.getWorkbook().createFont();
    firstFont.setFontName(fontName);// 設置字體
    firstFont.setFontHeightInPoints((short) excelTitle.getFontSize());// 設置字體大小
    firstFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗體顯示
    // 設置單元格的字體樣式
    HSSFCellStyle firstCellStyle = excelTitle.getWorkbook().createCellStyle();
    firstCellStyle.setFont(firstFont);
    firstCellStyle.setAlignment(excelTitle.getAlign());// 左右居中
    firstCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
    HSSFCellStyle tempStyle = excelTitle.getWorkbook().createCellStyle();
    tempStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左邊框
    HSSFRow firstRow = excelTitle.getSheet().createRow(excelTitle.getRow());
    HSSFCell cell = firstRow.createCell(0);
    cell.setCellValue(excelTitle.getTitle());
    // 合并單元格
    excelTitle.getSheet().addMergedRegion(new CellRangeAddress(excelTitle.getRow(),
        excelTitle.getRow(), 0, excelTitle.getCoverCellsNum() - 1));
    cell.setCellStyle(firstCellStyle);
    HSSFCell cellTemp = firstRow.createCell(excelTitle.getCoverCellsNum());
    cellTemp.setCellStyle(tempStyle);
  }
  
  
  public void fillData(HSSFWorkbook workbook, HSSFSheet sheet, List<List<Cell>> data, int offset) {
    HSSFFont boldFont = workbook.createFont();
    boldFont.setFontName(fontName);// 設置字體
    boldFont.setFontHeightInPoints((short) 12);// 設置字體大小
    boldFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗體顯示
    
    HSSFFont normalFont = workbook.createFont();
    normalFont.setFontName(fontName);// 設置字體
    normalFont.setFontHeightInPoints((short) 12);// 設置字體大小
    
    Map<String, HSSFCellStyle> mapStyle = new HashMap<String, HSSFCellStyle>();
    for (List<Cell> list : data) {
      HSSFRow row = sheet.createRow(offset);
      // 生成列名00
      for (int i = 0; i < list.size(); i++) {
        //sheet.autoSizeColumn(i, true);
        HSSFCell cell = row.createCell(i);
        Cell mCell = list.get(i);
        String value  = mCell.getValue();
        cell.setCellValue(value);
        
        String align = mCell.getAlign();
        String font = mCell.getFont();
        String border = mCell.getBorder();
        
        String key = align + font + border;
        
        HSSFCellStyle style = mapStyle.get(key);
        if (style == null) {
          style = sheet.getWorkbook().createCellStyle();
          if (ExcelReport.Cell.ALIGN_RIGHT.equals(mCell.getAlign())) {
            style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
          }
          if (ExcelReport.Cell.ALIGN_CENTER.equals(mCell.getAlign())) {
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
          }
          if (ExcelReport.Cell.FONT_BOLD.equals(mCell.getFont())) {
            HSSFFont firstFont = workbook.createFont();
            firstFont.setFontName(fontName);// 設置字體
            firstFont.setFontHeightInPoints((short) 12);// 設置字體大小
            firstFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗體顯示
            style.setFont(firstFont);
          }
          if (ExcelReport.Cell.BORDER_BOTTOM_NONE.equals(mCell.getBorder())) {
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左邊框
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上邊框
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右邊框
          } else if (ExcelReport.Cell.BORDER_TOP_NONE.equals(mCell.getBorder())) {
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下邊框
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左邊框
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右邊框
          } else {
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下邊框
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左邊框
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上邊框
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右邊框
          }
        }
        mapStyle.put(key, style);
        if (mCell.getNum() != null) {
          sheet.addMergedRegion(new CellRangeAddress(cell.getRowIndex(), cell.getRowIndex(), cell.getCellNum(), cell.getCellNum()+mCell.getNum()-1));
        }
        cell.setCellStyle(style);
      }
      offset++;
    }
  }
  
  /**
   * 上傳Excel文件
   * 
   * @param workbook
   *          Workbook
   * @param shop
   *          shopId
   * @param fileName
   *          文件名稱
   * @return
   * @throws Exception
   */
  public String uploadExcel(HSSFWorkbook workbook, String shop, String fileName) throws Exception {
    StringBuilder pathBuilder = new StringBuilder();
    pathBuilder.append(DOssKeyPrefix.getTempKeyPrefix());
    pathBuilder.append("/");
    pathBuilder.append(shop);

    StringBuilder nameBuilder = new StringBuilder();
    nameBuilder.append(System.nanoTime());
    nameBuilder.append(".");
    nameBuilder
        .append(StringUtils.reverse(StringUtils.reverse(fileName).split("\\.")[0]).toLowerCase());

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ByteArrayInputStream bais = null;
    try {
      workbook.write(baos);
      bais = new ByteArrayInputStream(baos.toByteArray());
      DOssObject obj = ossClient.putObject(pathBuilder.toString(), nameBuilder.toString(), bais);
      return obj.getObjectUrl();
    } catch (Exception e) {
      throw e;
    } finally {
      try {
        workbook.close();
        baos.close();
        bais.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

}

2跛锌、相關實體

1弃秆、ExcelReport

import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ExcelReport {

  private String title;// 主標題
  private String subTitle;// 副標題
  private String sheet;
  private String shop;
  private String fileName;
  
  private final List<List<Cell>> list = new ArrayList<>();// 需要渲染的數(shù)據(jù)值

  public static class Cell {
    
    public static final String ALIGN_RIGHT = "right"; // 右對齊
    public static final String ALIGN_CENTER = "center"; // 居中
    public static final String ALIGN_LEFT = "left"; // 左對齊
    public static final String FONT_DEFAULT = "default"; // 默認
    public static final String FONT_BOLD = "bold"; // 字體為粗體
    public static final String BORDER_BOTTOM_NONE = "bottom"; // 不加下邊框
    public static final String BORDER_TOP_NONE = "top";  // 不加上邊框
    
    private String value;
    private String align = ALIGN_LEFT;
    private String font = FONT_DEFAULT;
    private String border;  
    private Integer num; //合并單元格個數(shù)

    public Cell(String value, String align, String font, String border, Integer num) {
      super();
      this.value = value;
      this.align = align;
      this.font = font;
      this.border = border;
      this.num = num;
    }
    
    public Cell(String value, String align) {
      super();
      this.value = value;
      this.align = align;
      this.font = null;
      this.border = null;
      this.num = null;
    }
    
    public Cell(String value, String align, String font) {
      super();
      this.value = value;
      this.align = align;
      this.font = font;
      this.border = null;
      this.num = null;
    }
    
    public String getValue() {
      return value;
    }
    public void setValue(String value) {
      this.value = value;
    }
    public String getAlign() {
      return align;
    }
    public void setAlign(String align) {
      this.align = align;
    }
    public String getFont() {
      return font;
    }
    public void setFont(String font) {
      this.font = font;
    }

    public String getBorder() {
      return border;
    }

    public void setBorder(String border) {
      this.border = border;
    }

    public Integer getNum() {
      return num;
    }

    public void setNum(Integer num) {
      this.num = num;
    }
    
  }
  
  public static class ExcelTitle {
    private HSSFWorkbook workbook;
    private HSSFSheet sheet;
    private String title;
    private int coverCellsNum;
    private int fontSize;
    private int row;
    private short align;

    public ExcelTitle(HSSFWorkbook workbook, HSSFSheet sheet, String title, int coverCellsNum,
        int fontSize, int row, short align) {
      this.workbook = workbook;
      this.sheet = sheet;
      this.title = title;
      this.coverCellsNum = coverCellsNum;
      this.fontSize = fontSize;
      this.row = row;
      this.align = align;
    }

    public HSSFWorkbook getWorkbook() {
      return workbook;
    }

    public void setWorkbook(HSSFWorkbook workbook) {
      this.workbook = workbook;
    }

    public HSSFSheet getSheet() {
      return sheet;
    }

    public void setSheet(HSSFSheet sheet) {
      this.sheet = sheet;
    }

    public String getTitle() {
      return title;
    }

    public void setTitle(String title) {
      this.title = title;
    }

    public int getCoverCellsNum() {
      return coverCellsNum;
    }

    public void setCoverCellsNum(int coverCellsNum) {
      this.coverCellsNum = coverCellsNum;
    }

    public int getFontSize() {
      return fontSize;
    }

    public void setFontSize(int fontSize) {
      this.fontSize = fontSize;
    }

    public int getRow() {
      return row;
    }

    public void setRow(int row) {
      this.row = row;
    }

    public short getAlign() {
      return align;
    }

    public void setAlign(short align) {
      this.align = align;
    }

  }
  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getSubTitle() {
    return subTitle;
  }

  public void setSubTitle(String subTitle) {
    this.subTitle = subTitle;
  }

  public List<List<Cell>> getList() {
    return list;
  }

  public void setList(List<List<Cell>> list) {
    this.list.clear();
    if (null != list) {
      this.list.addAll(list);
    }
  }

  public String getSheet() {
    return sheet;
  }

  public void setSheet(String sheet) {
    this.sheet = sheet;
  }

  public String getShop() {
    return shop;
  }

  public void setShop(String shop) {
    this.shop = shop;
  }

  public String getFileName() {
    return fileName;
  }

  public void setFileName(String fileName) {
    this.fileName = fileName;
  }

}

2、ExcelReport

import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ExcelReport {

  private String title;// 主標題
  private String subTitle;// 副標題
  private String sheet;
  private String shop;
  private String fileName;
  
  private final List<List<Cell>> list = new ArrayList<>();// 需要渲染的數(shù)據(jù)值

  public static class Cell {
    
    public static final String ALIGN_RIGHT = "right"; // 右對齊
    public static final String ALIGN_CENTER = "center"; // 居中
    public static final String ALIGN_LEFT = "left"; // 左對齊
    public static final String FONT_DEFAULT = "default"; // 默認
    public static final String FONT_BOLD = "bold"; // 字體為粗體
    public static final String BORDER_BOTTOM_NONE = "bottom"; // 不加下邊框
    public static final String BORDER_TOP_NONE = "top";  // 不加上邊框
    
    private String value;
    private String align = ALIGN_LEFT;
    private String font = FONT_DEFAULT;
    private String border;  
    private Integer num; //合并單元格個數(shù)

    public Cell(String value, String align, String font, String border, Integer num) {
      super();
      this.value = value;
      this.align = align;
      this.font = font;
      this.border = border;
      this.num = num;
    }
    
    public Cell(String value, String align) {
      super();
      this.value = value;
      this.align = align;
      this.font = null;
      this.border = null;
      this.num = null;
    }
    
    public Cell(String value, String align, String font) {
      super();
      this.value = value;
      this.align = align;
      this.font = font;
      this.border = null;
      this.num = null;
    }
    
    public String getValue() {
      return value;
    }
    public void setValue(String value) {
      this.value = value;
    }
    public String getAlign() {
      return align;
    }
    public void setAlign(String align) {
      this.align = align;
    }
    public String getFont() {
      return font;
    }
    public void setFont(String font) {
      this.font = font;
    }

    public String getBorder() {
      return border;
    }

    public void setBorder(String border) {
      this.border = border;
    }

    public Integer getNum() {
      return num;
    }

    public void setNum(Integer num) {
      this.num = num;
    }
    
  }
  
  public static class ExcelTitle {
    private HSSFWorkbook workbook;
    private HSSFSheet sheet;
    private String title;
    private int coverCellsNum;
    private int fontSize;
    private int row;
    private short align;

    public ExcelTitle(HSSFWorkbook workbook, HSSFSheet sheet, String title, int coverCellsNum,
        int fontSize, int row, short align) {
      this.workbook = workbook;
      this.sheet = sheet;
      this.title = title;
      this.coverCellsNum = coverCellsNum;
      this.fontSize = fontSize;
      this.row = row;
      this.align = align;
    }

    public HSSFWorkbook getWorkbook() {
      return workbook;
    }

    public void setWorkbook(HSSFWorkbook workbook) {
      this.workbook = workbook;
    }

    public HSSFSheet getSheet() {
      return sheet;
    }

    public void setSheet(HSSFSheet sheet) {
      this.sheet = sheet;
    }

    public String getTitle() {
      return title;
    }

    public void setTitle(String title) {
      this.title = title;
    }

    public int getCoverCellsNum() {
      return coverCellsNum;
    }

    public void setCoverCellsNum(int coverCellsNum) {
      this.coverCellsNum = coverCellsNum;
    }

    public int getFontSize() {
      return fontSize;
    }

    public void setFontSize(int fontSize) {
      this.fontSize = fontSize;
    }

    public int getRow() {
      return row;
    }

    public void setRow(int row) {
      this.row = row;
    }

    public short getAlign() {
      return align;
    }

    public void setAlign(short align) {
      this.align = align;
    }

  }
  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getSubTitle() {
    return subTitle;
  }

  public void setSubTitle(String subTitle) {
    this.subTitle = subTitle;
  }

  public List<List<Cell>> getList() {
    return list;
  }

  public void setList(List<List<Cell>> list) {
    this.list.clear();
    if (null != list) {
      this.list.addAll(list);
    }
  }

  public String getSheet() {
    return sheet;
  }

  public void setSheet(String sheet) {
    this.sheet = sheet;
  }

  public String getShop() {
    return shop;
  }

  public void setShop(String shop) {
    this.shop = shop;
  }

  public String getFileName() {
    return fileName;
  }

  public void setFileName(String fileName) {
    this.fileName = fileName;
  }

}

3髓帽、Excel生成服務的調(diào)用

1驾茴、SaleReportExportController

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.wordnik.swagger.annotations.ApiOperation;

@Controller
@RequestMapping(value = "{shop}/report/export", produces = "application/json;charset=utf-8")
public class SaleReportExportController extends AbstractController {

  @Autowired
  private ExcelReportMakerService excelReportMakerService;

  public String createExcelBySaleSku2(String shop, List<BSaleSku> bSaleSkus, Date begin, Date end,
      String tags) throws Exception {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Shop shopEntity = shopService.get(shop);
    if (null == shopEntity) {
      throw new Exception("根據(jù)shop[" + shop + "],無法獲取到店鋪信息氢卡!");
    }

    StringBuffer subTitle = new StringBuffer();
    subTitle.append("時間:");
    subTitle.append(sdf.format(begin) + "至" + sdf.format(end));
    subTitle.append("  ");
    subTitle.append("標簽:");
    subTitle.append(null == tags ? "" : tags);
    subTitle.append("  ");
    subTitle.append("門店:");
    subTitle.append(null == shopEntity.getName() ? "" : shopEntity.getName());

    ExcelReport excelReport = new ExcelReport();
    excelReport.setTitle("銷售報表-銷售商品排行");
    excelReport.setFileName("銷售報表-銷售商品排行.xls");
    excelReport.setSheet("銷售商品排行");
    excelReport.setShop(shop);
    excelReport.setSubTitle(subTitle.toString());

    List<List<Cell>> listAll = new ArrayList<>();

    // 列名及對其方式
    List<ExcelReport.Cell> rowNameList = new ArrayList<>();
    rowNameList.add(createCell("排名", null, Cell.FONT_BOLD));
    rowNameList.add(createCell("商品名稱", null, Cell.FONT_BOLD));
    rowNameList.add(createCell("銷售額", null, Cell.FONT_BOLD));
    rowNameList.add(createCell("銷售量", null, Cell.FONT_BOLD));
    rowNameList.add(createCell("退貨額", null, Cell.FONT_BOLD));
    rowNameList.add(createCell("退貨量", null, Cell.FONT_BOLD));
    rowNameList.add(createCell("毛利額", null, Cell.FONT_BOLD));
    rowNameList.add(createCell("毛利率", null, Cell.FONT_BOLD));
    listAll.add(0, rowNameList);

    for (int i = 0; i < bSaleSkus.size(); i++) {
      BSaleSku bSaleSku = bSaleSkus.get(i);

      List<ExcelReport.Cell> listData = new ArrayList<>();
      listData.add(createCell(i + 1, Cell.ALIGN_RIGHT, null));
      listData.add(createCell(bSaleSku.getName(), null, null));
      listData.add(createCell(bSaleSku.getAmount(), Cell.ALIGN_RIGHT, null));
      listData.add(createCell(bSaleSku.getTotal().setScale(3, BigDecimal.ROUND_HALF_UP).toString(),
          Cell.ALIGN_RIGHT, null));
      listData.add(createCell(bSaleSku.getReturnAmount(), Cell.ALIGN_RIGHT, null));
      listData
          .add(createCell(bSaleSku.getReturnQty().setScale(3, BigDecimal.ROUND_HALF_UP).toString(),
              Cell.ALIGN_RIGHT, null));
      listData.add(createCell(bSaleSku.getGrossAmount(), Cell.ALIGN_RIGHT, null));
      listData.add(
          createCell(bSaleSku.getGrossRate().setScale(2, BigDecimal.ROUND_HALF_UP).toString() + "%",
              Cell.ALIGN_RIGHT, null));

      listAll.add(listData);
    }

    excelReport.setList(listAll);
    String urlPath = excelReportMakerService.make(excelReport);
    return urlPath;
  }

  /**
   * 目前只支持部分數(shù)據(jù)類型锈至,古國需要,自行添加译秦,Bigdecimal類型保留兩位小數(shù)
   * 
   * @param obj
   * @return
   */
  private Cell createCell(Object obj, String align, String font) {

    if (null == obj) {
      return null;
    }

    if (String.class.isInstance(obj)) {
      return new Cell(obj.toString(), align, font, null, null);
    } else if (BigDecimal.class.isInstance(obj)) {
      return new Cell(((BigDecimal) obj).setScale(2, BigDecimal.ROUND_HALF_UP).toString(), align,
          font, null, null);
    } else if (Number.class.isInstance(obj)) {
      return new Cell(String.valueOf(obj), align, font, null, null);
    }
    return null;
  }

  private Map<String, String> mapFilter(ListObjectRequest request) {
    Map<String, String> result = new HashMap<>();
    for (Entry<String, Object> entry : request.getFiltersAsEntries()) {
      result.put(entry.getKey(), ObjectUtils.toString(entry.getValue(), null));
    }
    return result;
  }

  private Date parseDate(String dateStr, SimpleDateFormat sdf, String exception)
      throws DposException {
    try {
      Date date = sdf.parse(dateStr);
      return date;
    } catch (Exception e) {
      if (!"".equals(dateStr) && dateStr != null) {
        throw new DposException(exception);
      }
      return null;
    }
  }
}

注:

該實現(xiàn)并非最好的實現(xiàn)方式峡捡,只是其中一種击碗,但可以有效的滿足大多數(shù)的情況,實例中只生成了最簡單的一種们拙,更復雜的效果稍途,可以通過改變參數(shù)來實現(xiàn)。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砚婆,一起剝皮案震驚了整個濱河市械拍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌装盯,老刑警劉巖坷虑,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異埂奈,居然都是意外死亡迄损,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門账磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芹敌,“玉大人,你說我怎么就攤上這事垮抗∈侠蹋” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵冒版,是天一觀的道長幌衣。 經(jīng)常有香客問我,道長壤玫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任哼凯,我火速辦了婚禮欲间,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘断部。我一直安慰自己猎贴,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布蝴光。 她就那樣靜靜地躺著她渴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔑祟。 梳的紋絲不亂的頭發(fā)上趁耗,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音疆虚,去河邊找鬼苛败。 笑死满葛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的罢屈。 我是一名探鬼主播嘀韧,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缠捌!你這毒婦竟也來了锄贷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤曼月,失蹤者是張志新(化名)和其女友劉穎谊却,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體十嘿,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡因惭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年环疼,在試婚紗的時候發(fā)現(xiàn)自己被綠了侈贷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡铁追,死狀恐怖咳燕,靈堂內(nèi)的尸體忽然破棺而出勿决,到底是詐尸還是另有隱情,我是刑警寧澤招盲,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布低缩,位于F島的核電站,受9級特大地震影響曹货,放射性物質(zhì)發(fā)生泄漏咆繁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一顶籽、第九天 我趴在偏房一處隱蔽的房頂上張望玩般。 院中可真熱鬧,春花似錦礼饱、人聲如沸坏为。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匀伏。三九已至,卻和暖如春蝴韭,著一層夾襖步出監(jiān)牢的瞬間够颠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工榄鉴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摧找,地道東北人核行。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像蹬耘,于是被迫代替她去往敵國和親芝雪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

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