【Javascript】檔案資料處理:透過瀏覽器讀取本機檔案進行文字操作

更新 發佈閱讀 11 分鐘

案例情境

工作上固定頻率會收到User提供的設定需求資訊,檔案大多為Excel的格式.xlsx.xls,需要擷取內容的參數資訊,轉換撰寫sql語法寫入資料庫進行操作。

既然格式都是固定的,何不動手寫個小工具,一鍵完成轉換呢?如此一來,不管設定資料的數量多寡都能瞬間完成處理。更重要的是,萬一User臨時變更需求,只要對方重新提供新的設定檔,作業都是瞬間完成的事,而且程式化也能避免人工手動鍵入更新的錯誤,蠻值得花點時間試試。

實作方式

  1. 將Excel另存成utf-8編碼的csv檔案,避免中文顯示亂碼或問號出現。
  2. 用程式讀取檔案,取得內容參數。
  3. 撰寫程式邏輯,整理輸出成想要的格式。


實作考量

雖然本次主要介紹透過瀏覽器進行處理,但在之前已經先用其他語言進行過實作,下面分別探討實作方式的考量:

Python

既然目標是對本機檔案的讀寫操作,首選一定是後端語言出發,其中最簡單的方式非Python莫屬,只不過,如果受限於公司資訊部門防火牆政策,本機可能無法進行下載或安裝。


Java

如果公司本身使用的語言是Java,大多不會有問題,甚至可以打包輸出成可執行的jar檔,提供給同事們使用。但,除非系統開發上需要,我個人並不喜歡用Java的檔案讀寫處理簡單的小程式。FileReader、FileInputStream、BufferedInputStream或是第三方apacheFileUtilsJava 8Files等等,雖然提供多種方式以應對多樣的使用場景,同時也造成選擇困難。


Javascript

使用Node.js來說,呼叫同步的readFileSync使用上跟Python不會差太多,呼叫非同步的readFile則需要注意實作上的差異,等待callback完成才會讀到資料。同樣,Nodejs也可能會因防火牆政策而不能下載或安裝。

前端網頁其實可以進行檔案上傳跟下載,是否也意味著可以上傳後讓網頁取得檔案,進行處理後,再提供下載功能呢?可行的話,寫好的程式也可以分享出去,畢竟公司內電腦總不會限制不給裝瀏覽器吧?


動手試試

基本版型

打開vscode,新建一個html檔案,鍵入!快速建立版型。

vocus|新世代的創作平台

body區塊內加入input標籤,並且type="file"

vocus|新世代的創作平台


用瀏覽器打開index.html確認結果,點擊選擇檔案會叫出檔案總管,可以選擇要上傳的檔案。

vocus|新世代的創作平台

展示

為了方便使用,加入一個點擊按鈕及一個展示區塊,並且給定展示區塊呈現大小。

<style>
#display_area {
width: 800px;
height: 600px;
}
</style>

<body>
<input type="file" id="source">
<hr>
<button id="display_btn">顯示</button><br>
<textarea id="display_area"></textarea>
</body>

程式邏輯

  1. 習慣上我會把script標籤放在head區塊,在document加入事件監聽器,確保DOM載入完成後才觸發執行main
  2. 腳本語言通常不會有主要的程式進入點,因此我還是會加入一個main function
    由於main function只會執行一次,不會進行複用,也可以inline進去上方監聽的程式中,改以匿名函式ES6的箭頭函式的寫法,只是我個人不喜歡很多層的巢狀。
  3. main中,選取顯示的按鈕並加入監聽click事件,事件觸發handleDisplay
  4. 顯示按鈕點擊觸發後,使用瀏覽器的File api讀取上傳檔案,並將檔案內容以文字進行讀取。
  5. 讀取完成拿到檔案內容,將內容更新到顯示區塊中。
<script>
document.addEventListener("DOMContentLoaded", main);

function main() {
const displayBtn = document.querySelector("#display_btn");
displayBtn.addEventListener("click", handleDisplay);
}


function handleDisplay() {
const source = document.querySelector("#source");
const displayArea = document.querySelector("#display_area");
const file = source.files[0];

const fileReader = new FileReader();
fileReader.readAsText(file);
fileReader.onload = (event) => {
const fileContent = event.target.result;
displayArea.innerHTML = fileContent;
}
}
</script>
  1. 最後把結果丟給AI幫忙做點調整跟優化,加入防呆的錯誤處理跟檔案類型限制,完整程式碼如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#display_area {
width: 800px;
height: 600px;
border: 1px solid #ccc;
padding: 10px;
overflow: auto;
white-space: pre-wrap;
}
</style>
<script>
document.addEventListener("DOMContentLoaded", () => {
const displayBtn = document.querySelector("#display_btn");
displayBtn.addEventListener("click", handleDisplay);
});

function handleDisplay() {
const source = document.querySelector("#source");
const displayArea = document.querySelector("#display_area");
const file = source.files[0];

if (!file) {
displayArea.textContent = "No file selected.";
return;
}

if (!file.type.match('text.*')) {
displayArea.textContent = "Invalid file type. Please select a text file.";
return;
}

const fileReader = new FileReader();
fileReader.readAsText(file);

fileReader.onload = (event) => {
const fileContent = event.target.result;
displayArea.textContent = fileContent;
};

fileReader.onerror = () => {
displayArea.textContent = "Error reading file.";
};
}
</script>
</head>
<body>
<input type="file" id="source">
<hr>
<button id="display_btn">顯示</button><br>
<div id="display_area"></div>
</body>
</html>

成果

選擇本機一個spring-boot專案的pom.xml為例,點擊顯示後,內容顯示在下方文字區塊內。

vocus|新世代的創作平台



結語

總結一下,上述內容做到的僅有讀取本機上的檔案,將讀到的內容顯示在網頁上,內容即為fileContent

至於資料可以自行使用javascript語法對fileContent做調整,例如處理csv檔案,可透過split處理\r\n拿到每一行,再對,分割取得每一項參數資料值,整理好資料再展示到畫面上。

留言
avatar-img
Err500
18會員
84內容數
遇到的坑、解過的題、新知識的探索、舊時代的遺毒!? 工作後我發現,文件更新往往跟不上新需求的更迭,犯錯的歷史總是不斷重演。因此,我改變了方式,蒐集從程式上、系統上的每一次異常處理過程,好讓再次遇到相同的問題時能快速應變。此專題就是我的錯題本,期待日後不管在工作上或交流上遇到難題,都能輕鬆地應答:有什麼難的,我都踩過。
Err500的其他內容
2024/04/09
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
2024/04/09
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
2023/12/24
專案產生大量又瑣碎的作業做處理,眼下要從iReport的設定檔(jrxml)擷取每一項套印參數出來,提供給別人做Excel公式的資料表進行作業。
Thumbnail
2023/12/24
專案產生大量又瑣碎的作業做處理,眼下要從iReport的設定檔(jrxml)擷取每一項套印參數出來,提供給別人做Excel公式的資料表進行作業。
Thumbnail
2021/05/30
輸入畫面 為什麼要做驗證? 因為作為設計者,永遠不該預設使用者會乖乖照設計者的意思輸入。
Thumbnail
2021/05/30
輸入畫面 為什麼要做驗證? 因為作為設計者,永遠不該預設使用者會乖乖照設計者的意思輸入。
Thumbnail
看更多
你可能也想看
Thumbnail
NodeJS 學習來到 file systems 操作,在文檔操作上有分為同步跟異步的處理,接下來分階段介紹操作函數
Thumbnail
NodeJS 學習來到 file systems 操作,在文檔操作上有分為同步跟異步的處理,接下來分階段介紹操作函數
Thumbnail
一、泛用型的電子公文系統是為了解決底下幾種痛點: 痛點一:為了不同公文流程就要開發不同程式針對不同的公文流程常常因為資料格式的不一致,就要設計好幾種Table,哪怕只是差異一點點的欄位都必須重新設計好幾種不同的流程做因應,一般中小型的公司並沒有辦法有太多的軟體人員做開發...
Thumbnail
一、泛用型的電子公文系統是為了解決底下幾種痛點: 痛點一:為了不同公文流程就要開發不同程式針對不同的公文流程常常因為資料格式的不一致,就要設計好幾種Table,哪怕只是差異一點點的欄位都必須重新設計好幾種不同的流程做因應,一般中小型的公司並沒有辦法有太多的軟體人員做開發...
Thumbnail
檔案存取 路徑與檔案處理是很常用的功能,他們可以獨立運作,但是常常搭配一起使用,如果你處理的檔案是在當下的目錄,可以不需要使用路徑的功能單獨讀寫檔案,如果是想要做一些資料夾的管理,就需要理解路徑和檔案之間的關係。
Thumbnail
檔案存取 路徑與檔案處理是很常用的功能,他們可以獨立運作,但是常常搭配一起使用,如果你處理的檔案是在當下的目錄,可以不需要使用路徑的功能單獨讀寫檔案,如果是想要做一些資料夾的管理,就需要理解路徑和檔案之間的關係。
Thumbnail
在第十四課中,我們將探討 Python 中的檔案操作,包括如何讀取、寫入和管理文件。這對於許多實際應用場景都是必要的,例如日誌記錄、資料分析和資料持久化。
Thumbnail
在第十四課中,我們將探討 Python 中的檔案操作,包括如何讀取、寫入和管理文件。這對於許多實際應用場景都是必要的,例如日誌記錄、資料分析和資料持久化。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
在實務開發中,我們常常需要從 Excel 讀取資料,例如: 👉 報表匯入 👉 資料轉換 👉 批次處理 這篇會帶你用 Microsoft.Office.Interop.Excel 來實作一個最基本的 Excel 讀取範例,並說明幾個非常重要的細節(尤其是資源釋放!)
Thumbnail
在實務開發中,我們常常需要從 Excel 讀取資料,例如: 👉 報表匯入 👉 資料轉換 👉 批次處理 這篇會帶你用 Microsoft.Office.Interop.Excel 來實作一個最基本的 Excel 讀取範例,並說明幾個非常重要的細節(尤其是資源釋放!)
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 身為專業的軟體開發者的我們, 除了讓程式會動之外, 也
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 身為專業的軟體開發者的我們, 除了讓程式會動之外, 也
Thumbnail
在第九課中,我們將學習 Python 的文件讀取與寫入。 Python 提供了一些內建的函式,使我們能夠輕鬆讀取和寫入文件。
Thumbnail
在第九課中,我們將學習 Python 的文件讀取與寫入。 Python 提供了一些內建的函式,使我們能夠輕鬆讀取和寫入文件。
Thumbnail
專案產生大量又瑣碎的作業做處理,眼下要從iReport的設定檔(jrxml)擷取每一項套印參數出來,提供給別人做Excel公式的資料表進行作業。
Thumbnail
專案產生大量又瑣碎的作業做處理,眼下要從iReport的設定檔(jrxml)擷取每一項套印參數出來,提供給別人做Excel公式的資料表進行作業。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News