Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
網(wǎng)頁(yè)開(kāi)發(fā)中,我們經(jīng)常需要將表格中的數(shù)據(jù)導(dǎo)出為CSV文件,以便進(jìn)行數(shù)據(jù)分析或共享。今天,我們就來(lái)分享一下如何通過(guò)JavaScript實(shí)現(xiàn)這個(gè)功能。具體實(shí)現(xiàn)步驟包括:提取表格數(shù)據(jù)、構(gòu)建CSV字符串、創(chuàng)建下載鏈接以及觸發(fā)下載操作。希望這個(gè)教程能幫你輕松實(shí)現(xiàn)表格數(shù)據(jù)導(dǎo)出功能!
首先,我們來(lái)看一下完整的代碼片段,然后再進(jìn)行分段介紹。
function extractTableData(tableId) {
const table = document.getElementById(tableId);
const data = [];
for (const row of table.rows) {
const rowData = [];
for (const cell of row.cells) {
rowData.push(cell.innerText.trim());
}
data.push(rowData);
}
return data;
}
function buildCsvString(data) {
return data.map(row => row.join(',')).join('\n');
}
function createDownloadLink(csvContent) {
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8' });
return URL.createObjectURL(blob);
}
function triggerDownload(url, filename) {
const link = document.createElement('a');
link.href = url;
link.download = filename;
link.click();
URL.revokeObjectURL(url);
}
function exportTableToCsv(tableId, filename) {
const tableData = extractTableData(tableId);
const csvContent = buildCsvString(tableData);
const downloadUrl = createDownloadLink(csvContent);
triggerDownload(downloadUrl, filename);
}
// 調(diào)用示例
exportTableToCsv('myTableId', 'exported_data.csv');
首先,我們需要通過(guò) document.getElementById 選擇目標(biāo)表格。然后,我們使用 for...of 循環(huán)遍歷每一行 (<tr>) 和每一個(gè)單元格 (<td>),提取其中的文本內(nèi)容并去除多余的空格。
function extractTableData(tableId) {
const table = document.getElementById(tableId);
const data = [];
for (const row of table.rows) {
const rowData = [];
for (const cell of row.cells) {
rowData.push(cell.innerText.trim());
}
data.push(rowData);
}
return data;
}
在這個(gè)函數(shù)中,我們首先通過(guò)ID獲取目標(biāo)表格,然后遍歷每一行和每一個(gè)單元格,將單元格的文本內(nèi)容去除多余空格后存入一個(gè)數(shù)組,最后將這個(gè)數(shù)組推入 data 數(shù)組中。
接下來(lái),我們創(chuàng)建一個(gè)函數(shù) buildCsvString,將提取的表格數(shù)據(jù)構(gòu)建成CSV字符串。我們使用逗號(hào)(,)連接每行的數(shù)據(jù),并用換行符(\n)連接每行。
function buildCsvString(data) {
return data.map(row => row.join(',')).join('\n');
}
在這個(gè)函數(shù)中,我們使用 map 方法遍歷每一行的數(shù)據(jù),將每行數(shù)據(jù)用逗號(hào)連接成字符串,然后再用換行符將所有行連接成一個(gè)完整的CSV字符串。
使用 Blob 對(duì)象創(chuàng)建一個(gè)表示CSV數(shù)據(jù)的blob,并將其類型設(shè)置為 text/csv。然后,使用 URL.createObjectURL 創(chuàng)建一個(gè)臨時(shí)的URL來(lái)指向這個(gè)blob。
function createDownloadLink(csvContent) {
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8' });
return URL.createObjectURL(blob);
}
在這個(gè)函數(shù)中,我們首先創(chuàng)建一個(gè) Blob 對(duì)象,并將CSV內(nèi)容傳入。然后,使用 URL.createObjectURL 方法創(chuàng)建一個(gè)指向這個(gè) Blob 對(duì)象的臨時(shí)URL。
最后,我們創(chuàng)建一個(gè)新的錨點(diǎn) (<a>) 元素,并將其 href 屬性設(shè)置為臨時(shí)URL,download 屬性設(shè)置為我們想要的文件名(例如,"exported_data.csv")。然后,模擬點(diǎn)擊事件以啟動(dòng)下載。
function triggerDownload(url, filename) {
const link = document.createElement('a');
link.href = url;
link.download = filename;
link.click();
URL.revokeObjectURL(url);
}
在這個(gè)步驟中,我們創(chuàng)建一個(gè)新的 <a> 元素,并設(shè)置其 href 和 download 屬性。然后,通過(guò)調(diào)用 click 方法模擬一次點(diǎn)擊事件,觸發(fā)文件下載。最后,使用 URL.revokeObjectURL 方法釋放這個(gè)臨時(shí)URL。
最后,我們將上述步驟整合到一個(gè)函數(shù)中,便于調(diào)用。
function exportTableToCsv(tableId, filename) {
const tableData = extractTableData(tableId);
const csvContent = buildCsvString(tableData);
const downloadUrl = createDownloadLink(csvContent);
triggerDownload(downloadUrl, filename);
}
// 調(diào)用示例
exportTableToCsv('myTableId', 'exported_data.csv');
通過(guò)以上步驟,你就可以輕松實(shí)現(xiàn)將表格數(shù)據(jù)導(dǎo)出為CSV文件的功能了。希望這篇教程對(duì)你有所幫助!如果有任何問(wèn)題或建議,歡迎在評(píng)論區(qū)留言互動(dòng)。
導(dǎo)出表格數(shù)據(jù)為CSV文件是一個(gè)非常實(shí)用的功能,不僅可以幫助我們方便地保存和分享數(shù)據(jù),還可以用于數(shù)據(jù)分析和處理。希望通過(guò)這篇文章,你能夠掌握這一技巧,并在實(shí)際項(xiàng)目中應(yīng)用。如果你覺(jué)得這篇文章對(duì)你有幫助,記得點(diǎn)贊、收藏并分享給更多的小伙伴!如果你有任何問(wèn)題或需要進(jìn)一步的幫助,歡迎在評(píng)論區(qū)留言,我會(huì)及時(shí)回復(fù)你。謝謝閱讀!
么是JSTL呢?JSTL英文全稱是:JavaServer Pages Standard Tag Library,中文意思是:Java服務(wù)頁(yè)面標(biāo)準(zhǔn)標(biāo)簽類庫(kù)。為什么會(huì)出現(xiàn)JSTL標(biāo)簽庫(kù)呢???我們來(lái)看下這種情況:假設(shè)現(xiàn)在需要循環(huán)渲染一個(gè)列表內(nèi)容,在沒(méi)有出現(xiàn)JSTL之前,如果使用JSP開(kāi)發(fā),那么我們可能會(huì)寫出下面這種代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>案例代碼</title>
</head>
<body>
<h3>循環(huán)輸出li列表</h3>
<% for (int i = 0; i < 5; i++) { %>
<li>
這是第<%=i %>個(gè)列表內(nèi)容
</li>
<% } %>
</body>
</html>
最終實(shí)現(xiàn)的效果就如下所示:
雖然上面的代碼可以實(shí)現(xiàn)循環(huán)輸出內(nèi)容的功能,但是你可以看到html代碼和Java代碼互相嵌套在一起,可讀性較差,并且后面代碼越來(lái)越多的時(shí)候,可維護(hù)性也會(huì)變得很差。為了解決這個(gè)問(wèn)題,提高JSP文件中Java代碼的可讀性,于是就出現(xiàn)了JSTL標(biāo)簽庫(kù),sun公司將常用的功能代碼封裝成了一個(gè)個(gè)指定的類似xml的標(biāo)簽,例如:<c:if>、<c:forEach>等等,并且結(jié)合EL表達(dá)式獲取到數(shù)據(jù),進(jìn)行數(shù)據(jù)的渲染,最終完成整個(gè)HTML網(wǎng)頁(yè)的展示。
<c:forEach>標(biāo)簽的作用是循環(huán)輸出內(nèi)容,是來(lái)自于JSTL核心標(biāo)簽庫(kù),標(biāo)簽庫(kù)地址:http://java.sun.com/jsp/jstl/core。我們?cè)谑褂脴?biāo)簽庫(kù)的時(shí)候,需要使用<%@taglib%>指令,語(yǔ)法格式如下所示:
// prefix屬性用于指定前綴名稱,一般寫【c】
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
如下圖所示:
通過(guò)<%@ taglib%>指令引入core核心庫(kù)標(biāo)簽之后,就可以在當(dāng)前JSP頁(yè)面中使用JSTL標(biāo)簽啦。<c:forEach>標(biāo)簽的語(yǔ)法格式如下所示:
<%--
items 屬性:需要循環(huán)變量的數(shù)據(jù)集合
begin 屬性:從哪個(gè)下標(biāo)開(kāi)始循環(huán)
end 屬性:哪個(gè)下標(biāo)結(jié)束循環(huán)
step 屬性:每一次循環(huán)的步長(zhǎng)
var 屬性:當(dāng)前遍歷到的元素變量名稱
varStatus 屬性:當(dāng)前遍歷到的元素狀態(tài);
index:可以通過(guò)index屬性獲取到當(dāng)前元素下標(biāo),從0開(kāi)始;
count:通過(guò)count屬性獲取當(dāng)前第幾次循環(huán),從1開(kāi)始;
first:是否第一個(gè)元素;
last:是否最后一個(gè)元素;
current:獲取當(dāng)前元素;
begin:開(kāi)始下標(biāo);
end:結(jié)束下標(biāo);
step:步長(zhǎng);
--%>
<c:forEach items="${randomNumList}" begin="0" end="3" step="1" var="item" varStatus="status">
<li>當(dāng)前元素:${item},下標(biāo):${status.index},總數(shù):${status.count}</li>
</c:forEach>
其中varStatus屬性具有下面這些屬性值:
下面來(lái)看看<c:forEach>標(biāo)簽的具體案例代碼。
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入標(biāo)簽庫(kù) --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>JSTL標(biāo)簽庫(kù)之c:for標(biāo)簽</title>
</head>
<body>
<%
List<Double> randomNumList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
randomNumList.add(Math.random() * 100);
}
pageContext.setAttribute("randomNumList", randomNumList);
%>
<h3>JSTL標(biāo)簽庫(kù)之c:for標(biāo)簽</h3>
<h3>c:for循環(huán)標(biāo)簽</h3>
<%--
items 屬性:需要循環(huán)變量的數(shù)據(jù)集合
begin 屬性:從哪個(gè)下標(biāo)開(kāi)始循環(huán)
end 屬性:哪個(gè)下標(biāo)結(jié)束循環(huán)
step 屬性:每一次循環(huán)的步長(zhǎng)
var 屬性:當(dāng)前遍歷到的元素變量名稱
varStatus 屬性:當(dāng)前遍歷到的元素狀態(tài);
index:可以通過(guò)index屬性獲取到當(dāng)前元素下標(biāo),從0開(kāi)始;
count:通過(guò)count屬性獲取當(dāng)前第幾次循環(huán),從1開(kāi)始;
first:是否第一個(gè)元素;
last:是否最后一個(gè)元素;
current:獲取當(dāng)前元素;
begin:開(kāi)始下標(biāo);
end:結(jié)束下標(biāo);
step:步長(zhǎng);
--%>
<c:forEach items="${randomNumList}" begin="0" end="3" step="1" var="item" varStatus="status">
<li>當(dāng)前元素:${item},下標(biāo):${status.index},總數(shù):${status.count}</li>
</c:forEach>
</body>
</html>
運(yùn)行結(jié)果如下所示:
以上,就是JSTL中的<c:forEach>循環(huán)語(yǔ)句標(biāo)簽的使用,<c:forEach>標(biāo)簽就是Java語(yǔ)言中的for語(yǔ)句。
今天就到這里,未完待續(xù)~~
一章節(jié)我們探討了Vue的入門,對(duì)Vue有了初步的了解,并且掌握了模板語(yǔ)法。本節(jié)課我們的學(xué)習(xí)目標(biāo)是Vue的指令。
首先解釋以下什么叫做指令,指定就是命令的意思,人們用指令表達(dá)自己的意圖。Vue中有多種指令,每種指令有不同的功能,比如有個(gè)指令的名字叫做v-text,此指令用于主要用來(lái)更新html標(biāo)簽InnerText內(nèi)容,等同于JS操作dom元素的text屬性。
除此以外vue還提供了多種指令,接下來(lái)我們就開(kāi)始詳細(xì)介紹這些指令的使用場(chǎng)景已經(jīng)使用方式。
我們已經(jīng)了解到Vue雖然使用場(chǎng)景與功能類似于JQuery,但是語(yǔ)法習(xí)慣完全不同于JQuery,比如Vue使用步驟主要有實(shí)例化Vue對(duì)象,掛載點(diǎn)使用模板語(yǔ)法綁定數(shù)據(jù)。除此以外Vue指令也是Vue使用中的重要組成部分,根據(jù)不同的指令有不同的功能,比如綁定事件,渲染InnerText數(shù)據(jù),渲染InnerHtml數(shù)據(jù)。
Vue中的指令存在的形式是以“v-”為前綴的特殊屬性,出現(xiàn)在html的標(biāo)簽的屬性部分,功能是當(dāng)表達(dá)式的值改變時(shí),將其產(chǎn)生的連帶影響,響應(yīng)式地作用于 DOM。
Vue指令的組成部分如下所示。
<tag標(biāo)簽 v-指令名="表達(dá)式"> </tag標(biāo)簽>
無(wú)論是傳統(tǒng)的原生js,還是老牌前端框架JQuery,包括正在學(xué)習(xí)的Vue,他們的功能主要都是操作dom節(jié)點(diǎn)對(duì)象,我們這里再?gòu)?fù)習(xí)一下dom節(jié)點(diǎn)的相關(guān)概念,因?yàn)橹噶罹褪菍?duì)DOM節(jié)點(diǎn)的操作。在 HTML DOM 中 , 每一個(gè)元素都是節(jié)點(diǎn),Vue指令就是節(jié)點(diǎn)的特殊屬性。Vue.js是數(shù)據(jù)驅(qū)動(dòng)的,無(wú)需手動(dòng)操作DOM,它通過(guò)指令語(yǔ)法,將DOM和數(shù)據(jù)綁定起來(lái)。一旦創(chuàng)建了綁定,DOM將和數(shù)據(jù)保持同步,每當(dāng)變更了數(shù)據(jù),DOM也會(huì)相應(yīng)地更新。
Vue提供了多種內(nèi)置的指令,不同的指令有不同的功能,在具體學(xué)習(xí)每種指令之前,我們先將部分常見(jiàn)指令以表格形式進(jìn)行一覽,如圖2.1所示。
圖2.1 部分指令一覽
先描述一個(gè)場(chǎng)景:現(xiàn)有一組標(biāo)簽,此標(biāo)簽展示內(nèi)容只有在當(dāng)前用戶符合某些條件的情況下才顯示。
這種類型的功能在開(kāi)發(fā)中是十分常見(jiàn)的,實(shí)現(xiàn)思路也很簡(jiǎn)單,需要先進(jìn)行判斷是否符合條件,根據(jù)判斷結(jié)果來(lái)決定是否展示標(biāo)簽。在Vue中想要實(shí)現(xiàn)此種功能,就需要使用v-if指令。
我們使用v-if指令來(lái)實(shí)現(xiàn)剛才描述的場(chǎng)景,創(chuàng)建index.html文件,并使用上一章節(jié)中我們學(xué)習(xí)過(guò)的內(nèi)容快速加載Vue環(huán)境,這里就不在重新闡述。index.html中判斷當(dāng)前l(fā)evel的值是否大于等于10,如果大于10在頁(yè)面中顯示文字:“歡迎來(lái)自艾歐尼亞的最強(qiáng)王者上機(jī)!”如果levle的值小于10則什么都不顯示。為了實(shí)現(xiàn)此效果,我們需要使用到v-if指令。index.html代碼內(nèi)容如2-1所示:
例2-1 index.html
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。