優雅 | 今天很水的文章-Excel導入導出

2021-02-14 小明菜市場

恩,這是小小本周的第六篇。

高能時刻即將到來!

前端部分

這裡闡述前端部分導入,導出,生成Excel表格這裡使用的是一個js-xlsx插件,所以這裡進行嘗試。

安裝依賴
yarn add xlsx

項目中引入
import * as XLSX from 'xlsx'

導出基本實現定義導出的基本方法
export default function download(json,fileName){
const type = 'xlsx'//定義導出文件的格式
var tmpDown;//導出的內容
var tmpdata = json[0];
json.unshift({});
var keyMap = []; //獲取keys
for (var k in tmpdata) {
keyMap.push(k);
json[0][k] = k;
}
var tmpdata = [];//用來保存轉換好的json

json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
v: v[k],
position: (j > 25 ? getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
}))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {
v: v.v
});
var outputPos = Object.keys(tmpdata); //設置區域,比如表格從A1到D10
var tmpWB = {
SheetNames: ['mySheet'], //保存的表標題
Sheets: {
'mySheet': Object.assign({},
tmpdata, //內容
{
'!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //設置填充區域
})
}
};
tmpDown = new Blob([s2ab(XLSX.write(tmpWB,
{bookType: (type == undefined ? 'xlsx':type),bookSST: false, type: 'binary'}//這裡的數據是用來定義導出的格式類型
))], {
type: ""
}); //創建二進位對象寫入轉換好的字節流
saveAs(tmpDown,fileName);
}

function saveAs(obj, fileName){//導出功能實現
var tmpa = document.createElement("a");
tmpa.download = fileName || "下載";
tmpa.href = URL.createObjectURL(obj); //綁定a標籤
tmpa.click(); //模擬點擊實現下載
setTimeout(function () { //延時釋放
URL.revokeObjectURL(obj); //用URL.revokeObjectURL()來釋放這個object URL
}, 100);
}

function s2ab(s){ //字符串轉字符流
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}

function getCharCol(n){
let temCol = '',
s = '',
m = 0
while (n > 0) {
m = n % 26 + 1
s = String.fromCharCode(m + 64) + s
n = (n - m) / 26
}
return s
}

項目中使用該方法
//導出excel
downloadExl = () => {
const { results } = this.props //需要導出的json數據
let datas = _.clone(results)//這裡為了不影響項目的數據的使用 採用了lodash中的深克隆方法
let json = datas.map(item=> { //將json數據的鍵名更換成導出時需要的鍵名
return {
'人員ID' :item.id,
'姓名' : item.name,
'證件類型': this.findIdType(item.idType),//將類型代號轉為漢字
'證件號碼': item.credentialsId,
'固定電話': item.tel,
'行動電話': item.mobile
}
})
download(json,'人員信息.xlsx')//導出的文件名
}

綁定事件
<Button onClick={this.downloadExl}>導出Excel</Button>

這樣就完成了Excel的導出

導入Excel功能實現定義相關的方法
//導入excel
onImportExcel = file => {
// 獲取上傳的文件對象
const { files } = file.target;
// 通過FileReader對象讀取文件
const fileReader = new FileReader();
fileReader.onload = event => {
try {
const { result } = event.target;
// 以二進位流方式讀取得到整份excel表格對象
const workbook = XLSX.read(result, { type: 'binary' });
// 存儲獲取到的數據
let data = [];
// 遍歷每張工作表進行讀取(這裡默認只讀取第一張表)
for (const sheet in workbook.Sheets) {
// esline-disable-next-line
if (workbook.Sheets.hasOwnProperty(sheet)) {
// 利用 sheet_to_json 方法將 excel 轉成 json 數據
data = data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
// break; // 如果只取第一張表,就取消注釋這行
}
}
// 最終獲取到並且格式化後的 json 數據
const uploadData = data.map(item=> {
return {
id : Number(item['人員ID']),
name : item['姓名'],
idType: this.findIdType(item['證件類型'],'string'),
credentialsId: item['證件號碼'],
tel: item['固定電話'],
mobile: item['行動電話']
}
})
console.log(uploadData)//這裡得到了後端需要的json數據,調用接口傳給後端就行了
message.success('上傳成功!') //這裡用了antd中的message組件
} catch (e) {
// 這裡可以拋出文件類型錯誤不正確的相關提示
message.error('文件類型不正確!');
}
};
// 以二進位方式打開文件
fileReader.readAsBinaryString(files[0]);
}

綁定事件
<Button className={Styles.upload_wrap}>
導入Excel
<input className={Styles.file_uploader} type='file' accept='.xlsx, .xls' onChange={this.onImportExcel} />
//這裡對原有的input樣式進行了修改,accept 屬性定義了上傳文件支持的類型,onChange 操作中的 importExcel 方法定義了上傳文件時執行的操作。
</Button>

獲得事件

這樣就完成了前端部分的導入和導出

後端部分

這裡闡述後端部分的導入和導出,這裡用Java做實例。這裡使用百萬級並發的POI作為導入和導出

添加maven
        <!-- excel導出工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>

導出Excel
package com.briup.apps.poll.web.controller;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
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.poifs.filesystem.POIFSFileSystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import com.briup.apps.poll.bean.Answer;
import com.briup.apps.poll.service.IAnswerService;
import com.briup.apps.poll.util.MsgResponse;

@Controller
@RequestMapping("/excel")
public class ExcelController extends BaseController{

@Autowired
private IAnswerService answerService;

/***
* 下載Excel
* @throws IOException
*/
@GetMapping("download")
public void download() throws IOException{

HSSFWorkbook workbook = new HSSFWorkbook();
//創建一個Excel表單,參數為sheet的名字
HSSFSheet sheet = workbook.createSheet("課調答卷表");

//創建表頭
setTitle(workbook, sheet);
List<Answer> answers = answerService.findAll();

//新增數據行,並且設置單元格數據
int rowNum = 1;
for (Answer answer:answers) {
HSSFRow row = sheet.createRow(rowNum);
row.createCell(0).setCellValue(answer.getId());
row.createCell(1).setCellValue(answer.getSelections());
row.createCell(2).setCellValue(answer.getCheckes());
row.createCell(3).setCellValue(answer.getContent());
rowNum++;
}
String fileName = "survey-answer.xlsx";
//清空response
response.reset();
//設置response的Header
response.addHeader("Content-Disposition", "attachment;filename="+ fileName);
OutputStream os = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/vnd.ms-excel;charset=gb2312");
//將excel寫入到輸出流中
workbook.write(os);
os.flush();
os.close();
}

/***
* 設置表頭
* @param workbook
* @param sheet
*/
private void setTitle(HSSFWorkbook workbook, HSSFSheet sheet){
HSSFRow row = sheet.createRow(0);
//設置列寬,setColumnWidth的第二個參數要乘以256,這個參數的單位是1/256個字符寬度
sheet.setColumnWidth(0, 10*256);
sheet.setColumnWidth(1, 20*256);
sheet.setColumnWidth(2, 20*256);
sheet.setColumnWidth(3, 100*256);

//設置為居中加粗
HSSFCellStyle style = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setBold(true);
style.setFont(font);

HSSFCell cell;
cell = row.createCell(0);
cell.setCellValue("序號");
cell.setCellStyle(style);

cell = row.createCell(1);
cell.setCellValue("單選");
cell.setCellStyle(style);

cell = row.createCell(2);
cell.setCellValue("多選");
cell.setCellStyle(style);

cell = row.createCell(3);
cell.setCellValue("簡答");
cell.setCellStyle(style);
}
}


結果

導入Excel
@PostMapping("upload")
public MsgResponse upload(MultipartFile file) {
if (file==null) {
return error("file不能為空");
}
List<Answer> answers = new ArrayList<>();
try {
HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(file.getInputStream()));
//有多少個sheet
int sheets = workbook.getNumberOfSheets();
for (int i = 0; i < sheets; i++) {
HSSFSheet sheet = workbook.getSheetAt(i);
//獲取多少行
int rows = sheet.getPhysicalNumberOfRows();
Answer answer = null;
//遍歷每一行,注意:第 0 行為標題
for (int j = 1; j < rows; j++) {
answer = new Answer();
//獲得第 j 行
HSSFRow row = sheet.getRow(j);
answer.setSelections(row.getCell(1).getStringCellValue());//單選
answer.setCheckes(row.getCell(2).getStringCellValue());//多選
answer.setContent(row.getCell(3).getStringCellValue());//簡答
answers.add(answer);
}
}

} catch (IOException e) {
logger.error(e.getMessage(),e);
return error(e.getMessage());
}
return success(answers);
}

這樣在後臺可以獲取到Excel的行與列。

相關焦點

  • Springboot整合easyExcel導入導出Excel
    、導出excel,因此在此記錄學習一下如何使用Springboot整合easyExcel;需求:資料庫中有張user表,有個業務要求可以導入、導出「用戶名單.xls」表一、準備:創建項目:關於springboot項目如何創建這裡不再贅述,放一張項目結構圖:1、導入easyexcel、mybatis、mysql依賴
  • 如何使用JavaScript實現前端導入和導出excel文件
    使用JavaScript實現前端基於Table數據一鍵導出excel文件同樣的, 我們實現將table數據一鍵導出為excel也是類似, 不過方案有所不同, 我們先來看看在Dooring中的實現效果.2.1 一鍵導出為excel實現效果以上就是用戶基於後臺採集到的數據, 一鍵導出excel文件的流程, 最後一張圖是生成的excel文件在office軟體中的呈現.
  • 【R包薈萃】Excel文件的批量導入與導出:openxlsx包實用技巧
    本期主要為大家介紹導入和導出excel文件的工具:openxlsx包,以及批量導入導出文件的一些小技巧。install.packages("openxlsx")library("openxlsx")導出excel文件使用的是write.xlsx函數,通過介紹我們可以看到該函數主要是將數據框導出為xlsx文件,同時由於excel可存在多個sheet,該函數也支持導出a list of data.frames。
  • 牛逼的EasyExcel,讓Excel導入導出更加簡單,附詳細教程!
    EasyExcel在做excel導入導出的時候,發現項目中封裝的工具類及其難用,於是去gitHub上找了一些相關的框架,最終選定了EasyExcel。之前早有聽聞該框架,但是一直沒有去了解,這次藉此學習一波,提高以後的工作效率。
  • R語言數據導入與導出
    R語言數據導入與導出整這麼一個系列,還是因為學R語言時遇到過一個非常「小白友好」的網站「DataScience Made Simple」。相信很多人搜到過這個網站,或許你在意到或許並沒在意。年前試著和作者發了一封郵件,想要把他這個網站做成漢語版的帖子發在公眾號上,讓我感動的是作者團隊欣然同意。於是就想著搞這麼一個系列,能不能堅持下來還不好說……且行且珍惜吧。
  • 數據科學 | pandas數據導入與導出
    當我們開始著手做一個數據分析項目時,選擇和導入數據集是第一個步驟,而導出數據雖然非必需,但有時候我們也需要保存處理或者分析後的結果,方便下次使用。在pandas中,它已經為我們提供了很多不同格式數據的導入和導出方法,下面這篇文章將具體介紹一些較為常用的方法,包括excel、csv文件以及資料庫的導入導出等。數據導入和導出是pandas中很基礎且重要的一個部分。
  • 網際網路海量新鮮文章批量導出&海量關鍵詞內容規劃可導出Excel分析
    導出的文檔格式,可根據自身需求選用,如需純文本的用戶,可選擇txt格式文檔,如需包含文章圖片的素材,可選擇word格式文檔。
  • 手機號碼,怎麼一鍵導入到Excel表格中?
    手機號碼導出步驟:1、安裝軟體在電腦和手機端均安裝360手機助手2、建立手機和電腦連接打開電腦端手機助手,點【立即連接】按鈕,然後打開手機端360手機助手,用頂端的掃一掃功能掃二維碼連接(或用USB線連接手機)
  • 梁寶川:如何導入,導出anki筆記?
    這個時候你必須導出相應的記憶庫。又或者你找到一些比較有價值的筆記模板,或者說有價值的筆記。所以要將它導入到自己的anki記憶庫當中。這都需要用到導入,導出環節。其實,關於導入,導出這個環節,我用的還是不少的。因為我有一個批量導入anki筆記的技巧。其中一個核心的環節就是導出幕布筆記,然後通過轉換格式,導入到anki當中。
  • (進階篇)使用PHP導入和導出CSV文件
    項目開發中,很多時候要將外部CSV文件導入到資料庫中或者將數據導出為CSV文件,那麼具體該如何實現呢?本文將使用PHP並結合mysql,實現了CSV格式數據的導入和導出功能。我們先準備mysql數據表,假設項目中有一張記錄學生信息的表student,並有id,name,sex,age分別記錄學生的姓名、性別、年齡等信息。
  • Java實現文件批量導入導出實踐(兼容xls,xlsx)
    Cat哥領讀:使用poi導入導出xls文件還是比較容易的,有完整的項目代碼,可以clone下來好好研究哈!
  • Access數據的導入與導出
    言歸正傳,大概可以知道Access的使用普及是遠遠不如Excel的,對於Access的認知多少也是有「偏見」的,當然也可能是文章寫的不好。其實,Access使用起來真的不難,不難,不難。接著昨天的內容繼續,今天介紹Access數據表的基礎操作——數據的導入與導出。如果不願意看文章的也可以看視頻,不過時間有點略長。▍創建一個Access資料庫打開Access程序以後,首先需要新建一個「空白資料庫」,因為所有的對象是基於資料庫來管理的。「表」就是資料庫最基本的對象。
  • NPOI 導出 excel 性能測試
    excel 性能測試Intro網上看到很多人說 NPOI 的性能不行,自己寫了一個 NPOI 的擴展庫,於是想嘗試看看 NPOI 的性能究竟怎麼樣,道聽途說始終不如自己動手一試。= new ExcelPackage(); var sheet = excel.Workbook.Worksheets.Add("tempSheet"); for (var i = 1; i <= RowsCount; i++) { for (var j = 1; j <
  • 後端:Hutool Java 工具類庫導出 Excel,超級簡單!
    在開發應用系統的時候,導出文件是必不可放的功能。以前用過POI、easyexcel等工具的導入導出功能,但總感覺太麻煩了,代碼特別多,感覺並不是很好用。今天給大家介紹一款新工具,java工具類庫Hutool。
  • Hutool Java 工具類庫導出 Excel,超級簡單!
    來源:toutiao.com/i6771298852050829835前言在開發應用系統的時候,導出文件是必不可放的功能以前用過POI、easyexcel等工具的導入導出功能,但總感覺太麻煩了,代碼特別多,感覺並不是很好用。今天給大家介紹一款新工具,java工具類庫Hutool。
  • SpringBoot整合EasyPoi實現Excel的導入和導出(帶圖片)
    點擊上方藍色字體,選擇「標星公眾號」優質文章,第一時間送達66套java從入門到精通實戰課程分享前言實際工作中可能會用到Excel的導入和導出功能excel     * @param response     * @throws IOException     */    @RequestMapping("/export")    public void exportExcel(HttpServletResponse response) throws IOException {        /
  • ng-notadd 0.15 發布,新增表格及 excel 導出
    新功能普通表格數據表格動態表格excel 導出 (可指定行,列)功能技術棧TypescriptAngular
  • excel圖片導出的方法
            excel教程中圖片導出的操作應該怎樣進行呢?  假設一個excel工作表中有上百張圖片,如何批量導出到某一文件夾呢?  excel圖片導出的方法如下介紹。
  • 如何快速導入通訊錄?
    但是如果手頭是普通的excel表,且經常需要導入導出的話,這個方法就不能算做是方便了。 能不能更簡單一點?今天寫這篇文章前,我又在想這個問題。一通搗鼓之下,找到2.0版本的方法。簡單對比下——1.0版本: excel表 => 某手機助手 => 手機 => 模擬器 2.0版本: excel表 => QQ同步助手(網頁版) => 模擬器
  • 增值稅電子發票識別軟體/一鍵導出excel表格
    關鍵詞:電子發票 電子發票識別 電子發票識別SDK 電子發票識別軟體 電子發票導出excel表格一、何為電子發票?四、增值稅電子發票識別軟體簡介北京奧普思凱科技有限公司致力於解決財務問題,其根據市場需求,推出的奧普快票通--增值稅電子發票識別軟體,能夠完美的解決電子發票影像保存、電子發票數據提取、發票查驗等工作,並且可一鍵導出excel表格!