如何解析你,Excel 的 Date 呀

2021-09-11 09:03:55 字數 1875 閱讀 7775

不久前,我們接了乙個自己做前端後端產品的活,從此過上了可憐巴巴敲**開開心心收穫知識的日子呢。

使用者小姐姐在群裡說,系統篩選工卡有效期不好使。(系統:不不不,不是我的鍋

我看了一下資料庫,發現,我們原定的有效期格式是這樣的

整整齊齊。

資料庫中當時的資料是這樣的

甚至是這樣的

看到這種情況,我覺得肯定是輸入的時候輸的不太對(年輕…

於是我決定從 excel 下手

小姐姐們的操作流程是先用我們的系統匯出乙份 excel,編輯之後再匯入系統的,那只要我把這工卡一列的格式限制為日期,就一定可以統一格式的,嗯。

我們專案使用了 js-xlsx 處理**的匯入匯出,下面是匯出 excel 的偽**:

import * as xlsx from 'xlsx';

officedocument.spreadsheetml.sheet'

const data = 資料.map((s: any) => ());

const sheet = xlsx.utils.json_to_sheet(data);

const wb = xlsx.utils.book_new();

const wbbuf = xlsx.write(wb, );

this.success();

複製**

通過 json_to_sheet 可以拿到包含單元格資訊的物件

,

b2: ,

a3: ,

b3: ,

a1: ,

b1: ,

'!ref': 'a1:b3'

}複製**

物件中以單元格位置作為 key,每個單元格的值(v)、型別(t)等等屬性作為 value。其中單元格的型別支援:

bboolean,nnumber,eerror,sstring,ddate

看起來 date 型別十分符合上面的要求,就嘗試了一下:

const sheet = xlsx.utils.json_to_sheet(data);

// 篩選出除表頭的工卡列

object.keys(sheet).filter(item => /^b/.test(item) && item !== "b1").foreach(key => )

複製**

然鵝,如果工卡有效期本來就為空,這時候匯出,開啟 excel 會報錯,並且空的位置會變成 nan

翻閱了各種中英文文件、issue,匯出一百多個員工資訊表之後,我發現 excel 真的很奇妙,或許應該在 js 上來格式化匯入的資料,而不是限制單元格的型別。

如果不控制單元格型別的話,那麼當管理員輸入日期的時候,這個單元格可能是:文字、常規、日期、自定義型別,所以只要保證不管單元格是什麼格式,程式都能拿到正確的資料就好了。

當管理員使的工卡有效期的單元格型別是文字或者常規的時候,則比較簡單,程式可以按預期解析出來乙個相應的字串,用 moment 解析一下,就可以獲得想要的格式的資料了。

那麼當有效期單元格的型別是日期和自定義的時候,我們拿到的資料是像下圖一樣

這也就是之前資料庫中奇怪的數字的由來,這個數字的意義,其實是當前日期距離 1900 年 1月 0 日的天數。還需要注意的是,excel 中有個 bug:

它以為 1900 年是閏年,所以我們拿到的天數都會多了一天,因為轉換之前還需要先進行減一操作…

item.工卡有效期 = new

date(1900, 0, expried - 1)

複製**

這樣之後就可以拿到正確的日期啦。咕嘰。

如何解析超長的protobuf

在呼叫protobuf的parsefromstring str 方法時,預設情況下,如果str的長度 64mb,會返回失敗。這裡給出了解釋,主要是出於安全因素的考慮。可以通過settotalbyteslimit方法去除這個限制 google protobuf message req google p...

DNS是如何解析的?

dns domain name system,負責將使用者請求的網域名稱解析為對應機器的ip位址。眾所周知,網際網路上的每一台機器的身份是由ip位址標識的,而我們想要與任何一台機器進行通訊都必須知道它的ip位址,然而,由於ip位址對人類來說難於記憶,因此就產生了網域名稱。就拿www.baidu.co...

後台如何解析html

string str 空白字型只是斜體斜體劃線 1111111加粗劃線樣式空白字型只是斜體斜體劃線 上面這個str字串,如何解析出類似於 文字 該文字塊有哪些屬性 i u b 文字樣式 public class fontstyle public void setisb boolean isb pub...