不久前,我們接了乙個自己做前端後端產品的活,從此過上了可憐巴巴敲**開開心心收穫知識的日子呢。
使用者小姐姐在群裡說,系統篩選工卡有效期不好使。(系統:不不不,不是我的鍋
我看了一下資料庫,發現,我們原定的有效期格式是這樣的
整整齊齊。
資料庫中當時的資料是這樣的
甚至是這樣的
看到這種情況,我覺得肯定是輸入的時候輸的不太對(年輕…
於是我決定從 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。其中單元格的型別支援:
b
boolean,n
number,e
error,s
string,d
date
看起來 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...