我有一个对象存储,需要导出或下载为 .csv 文件。我进行了一些搜索,但似乎找不到有关此功能的信息。欢迎不使用 IDB 的回复。
一些背景:这是工作项目的一部分,我在没有任何编码知识的情况下就投入了这个项目。我使用的是公司发行的 chromebook,因此(据我所知)NPM 安装不可用。
应用背景:该项目是通过单一终端操作的客户调查。该终端是我的 chromebook,如果我能够成功地将用户输入下载到 .csv 文件,我希望能够转移到 ipad。
到目前为止我所拥有的:
(function leadIDB() {
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB|| window.msIndexedDB;
if (!window.indexedDB) {
alert('indexDB not supported in this browser');
}
let request = window.indexedDB.open("leadDB", 1),
db,
tx,
store,
index;
request.onupgradeneeded = function(e) {
let db = request.result,
store = db.createObjectStore("LeadStore", {keyPath: "leadID", autoIncrement: true});
index = store.createIndex("firstName", "firstName", {unique: false});
};
request.onerror = function(e) {
console.log("There was an error: " + e.target.errorCode);
};
request.onsuccess = function(e) {
db = request.result;
tx = db.transaction("LeadStore", "readwrite");
store = tx.objectStore("LeadStore");
index = store.index("firstName");
db.onerror = function(e) {
console.log("ERROR" + e.target.errorCode);
};
store.put(newLead);
let lead = store.getAll();
lead.onsuccess = function() {
console.log(lead.result);
console.log(lead.result.firstName);
};
tx.oncomplete = function() {
console.log('Item added to LeadDB');
db.close();
};
};
})();
Run Code Online (Sandbox Code Playgroud)
你走在正确的轨道上。还有一些事情要做。首先,一旦将数据从indexedDB加载到js内存中,您需要能够继续处理。接下来,您需要在内存中生成 CSV 文件(作为一个巨大的字符串)。接下来,您需要将 csv 字符串转换为File(它实现Blob)。最后,您想要触发文件的下载。
有几种方法可以完成第一步。我将使用承诺,但您可以通过回调或任何您喜欢的方式来完成此操作。
function loadData() {
return new Promise((resolve, reject) => {
var openrequest = indexedDB.open(...);
openrequest.onupgradeneeded = ...;
openrequest.onerror = event => reject(event.target.error);
openrequest.onsuccess = event => {
var db = event.target.result;
var txn = db.transaction(...);
var store = txn.objectStore(...);
var loadrequest = store.getAll();
loadrequest.onerror = event => reject(event.target.error);
loadrequest.onsuccess = event => {
var data = event.target.result;
resolve(data);
};
};
});
}
// You could call the function like this for example:
async function foo() {
var data = await loadData();
console.log('loaded the data, loaded %d objects', data.length);
}
Run Code Online (Sandbox Code Playgroud)
接下来,您想要将数据转换为 csv 格式的字符串。
// This is not perfect, just an example of getting you closer
function toCSV(data) {
var output = [];
for(var object of data) {
var row = [];
for(var prop in object) {
row.push(to_csv_value(object[prop]));
row.push(',');
}
row.push('\n');
output.push(row.join(''));
}
return output.join('');
}
function to_csv_value(value) {
var output = '"';
output += value.replace('"', '\\"');
return output + '"';
}
// and then to compose it for example:
async function foo() {
var data = await loadData();
var csvstring = toCSV(data);
}
Run Code Online (Sandbox Code Playgroud)
接下来,您要创建一个文件。您可以使用 Blob 构造函数来执行此操作。像下面这样:
// Because File implements blob interface, we are effectively creating a file
// by creating a blob
function createCSVFileFromString(string) {
var csv_mime_type = 'text/csv';
return new Blob([string], {type: csv_mime_type});
}
// And again, to compose it:
async function foo() {
var data = await loadData();
var string = toCSV(data);
var blob = createCSVFileFromString(string);
}
Run Code Online (Sandbox Code Playgroud)
下一步是使 blob 可下载。这通常可以使用对象 url 策略来完成。有点像下面这样:
function downloadBlob(blob, filename) {
var anchor = document.createElement('a');
anchor.setAttribute('download', filename);
var url = URL.createObjectURL(blob);
anchor.setAttribute('href', url);
anchor.click();
URL.revokeObjectURL(url);
}
// And finally, to compose it all together
async function loadAndStartDownloadingData() {
var data = await loadData();
var csvstring = toCSV(data);
var blob = createCSVFileFromString(csvstring);
downloadBlob(blob, 'mydata.csv');
}
Run Code Online (Sandbox Code Playgroud)
然后,在您的应用程序中的某个位置,假设单击按钮,您将执行类似的操作。我在这里使用非异步语法只是为了在非等待中使用 Promise,你要始终小心不要隐藏错误。
var button = ...;
button.onclick = function(event) {
// Load the data and trigger the download, and send any problems to console
loadAndStartDownloadingData().catch(console.warn);
};
Run Code Online (Sandbox Code Playgroud)
请注意,这不包括插入数据,但我相信您可以弄清楚。
归档时间: |
|
查看次数: |
3646 次 |
最近记录: |