Infinity 导出 Excel

Infinity Pro 网站版,将您保存的网站导出为一个 Excel 文件。导出前需要登录账号,如果导出的网站为空,请先刷新界面。

当前为 2021-11-06 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Infinity 导出 Excel
// @version      1.0.3
// @icon         https://inftab.com/icon/favicon.ico
// @description  Infinity Pro 网站版,将您保存的网站导出为一个 Excel 文件。导出前需要登录账号,如果导出的网站为空,请先刷新界面。
// @author       曦源 <[email protected]>
// @match        *://inftab.com/*
// @match        *://www.inftab.com/*
// @grant        none
// @run-at       document-end
// @namespace    项目地址github
// @supportURL   https://github.com/SunBrook/infinity_tool_scripts
// @homepageURL  https://github.com/SunBrook/infinity_tool_scripts
// ==/UserScript==


'use strict';

function init(){
    // 目标位置
    var backup_btn_box = document.querySelector("side-profile")
    .shadowRoot.querySelector("side-user")
    .shadowRoot.querySelector("infinito-card.backup-recovery .backup-btn-box");

    // 创建 Excel 导出页面元素
    var export_excel_node = document.createElement("div");
    export_excel_node.className = "backup-btn-card";
    export_excel_node.innerHTML = ''+
    '<div class="backup-btn-content"  onClick="GetWebInfoV2()">'+
    '<div class="backup-btn">'+
    '<div class="backup-btn-title">'+
    '<span class="backup-btn-title-text"><!---->导出 Excel 文件<!----></span>'+
    '<i-svg></i-svg>'+
    '</div>'+
    '<span class="backup-btn-desc"><!---->从当前本地数据导出<!----></span>'+
    '</div>'+
    '</div>';

    // 创建完成后,然后在设置图标
    var createFirst = new Promise(function (resolve, reject){
    backup_btn_box.append(export_excel_node);
    resolve("finish");
    });

    createFirst.then(function(message){
    // 设置导出图标样式
    var ico_svg = backup_btn_box.querySelector(".backup-btn-card:nth-child(4) .backup-btn-title i-svg")
    .shadowRoot.querySelector(".svg");
    ico_svg.style.webkitMaskImage = "url(/images/arrow-right.d51ffb7.svg)";
    });
}

setTimeout(init, 3000);


//网站数量
var tb_count = 0;

//获取用户的网站信息
function GetWebInfoV2() {
    //表头
    var tableHtml = '<div id="z_wrapper" style="z-index: 999999;position: absolute;background-color: white;width: 1000px;height: 500px;margin-left: 150px;margin-top:50px;overflow-y: scroll;padding:8px;filter:alpha(Opacity=80);-moz-opacity:0.5;opacity: 0.8;border-radius: 15px;">' +
        '<table id="z_table" style="border-collapse: collapse;text-align:center;">' +
        '<tr>' +
        '<th style="border: 1px solid #ccc;padding:5px;width:500px;height:40px;">名称</th>' +
        '<th style="border: 1px solid #ccc;padding:5px;width:500px;height:40px;">网址</th>' +
        '<th style="border: 1px solid #ccc;padding:5px;width:100px;height:40px;">分类</th>' +
        '</tr>';

    //获取 window.localStorage
    var storage = window.localStorage;
    if (!storage) {
        alert("浏览器不支持LocalStorage");
        return;
    }

    //用户收藏的网站json字符串
    var store_site = storage["store-site"];
    if (!store_site) {
        alert("导出失败,请刷新页面重试");
        return;
    }

    //字符串 转 ToJson对象
    var u_list = JSON.parse(store_site).sites;

    //遍历 - 每页
    for (let i = 0; i < u_list.length; i++) {
        var page_list = u_list[i]; //某一页
        for (let j = 0; j < page_list.length; j++) {
            var unit_list = page_list[j]; //某个单元格
            var image_type = unit_list.bgType;
            //判断是 单个网站 还是文件夹 image / folder
            if (image_type == "image" || image_type == "color") {
                //单个网站 纯色
                //网站
                var url = unit_list.target;
                //过滤 infinity:// 开头的官方应用
                var fdStart = url.indexOf("infinity://");
                if (fdStart == 0) continue;
                //名称
                var name = unit_list.name;
                tableHtml += '<tr>' +
                    '<td style="border: 1px solid #ccc;padding:5px;height:25px;"  align="center">' + name + '</td>' +
                    '<td style="border: 1px solid #ccc;padding:5px;height:25px;"><a href="' + url + '" target="_blank">' + url + '</a></td>' +
                    '<td style="border: 1px solid #ccc;padding:5px;height:25px;"  align="center"></td>' +
                    '</tr>';
                tb_count++;
            } else if (image_type == undefined) {
                //文件夹
                //文件夹名称
                var folder_name = unit_list.name;
                //文件夹子项集合
                var folder_list = unit_list.children;
                //只要用户自定义的网站集合
                var item_user_disposed = new Array();
                for (let k = 0; k < folder_list.length; k++) {
                    var url = folder_list[k].target;
                    var fdStart = url.indexOf("infinity://");
                    if (fdStart == 0) continue;
                    item_user_disposed.push({ url: url, name: folder_list[k].name });
                }
                //组成table
                if (!item_user_disposed.length) continue;
                for (let m = 0; m < item_user_disposed.length; m++) {
                    if (m == 0) {
                        tableHtml += '<tr>' +
                            '<td style="border: 1px solid #ccc;padding:5px;height:25px;" align="center">' + item_user_disposed[m].name + '</td>' +
                            '<td style="border: 1px solid #ccc;padding:5px;height:25px;"><a href="' + item_user_disposed[m].url + '" target="_blank">' + item_user_disposed[m].url + '</a></td>' +
                            '<td style="border: 1px solid #ccc;padding:5px;height:25px;"  align="center" rowspan="' + item_user_disposed.length + '">' + folder_name + '</td>' +
                            '</tr>';
                    } else {
                        tableHtml += '<tr>' +
                            '<td style="border: 1px solid #ccc;padding:5px;height:25px;" align="center">' + item_user_disposed[m].name + '</td>' +
                            '<td style="border: 1px solid #ccc;padding:5px;height:25px;"><a href="' + item_user_disposed[m].url + '" target="_blank">' + item_user_disposed[m].url + '</a></td>' +
                            '</tr>';
                    }
                }
                tb_count += item_user_disposed.length;
            }
        }
    }

    tableHtml += '</table></div><a id="dlink"  style="display:none;"></a><input type="button" onclick="tableToExcel(\'tablename\', \'name\', \'myfile.xlsx\')" value="Export to Excel">';
    var div_table = document.createElement("div");
    div_table.id = 'temp_div';
    div_table.innerHTML = tableHtml;
    document.body.appendChild(div_table);

    console.log("网站个数:", tb_count);

    // tableToExcel('z_table', " 累计 " + tb_count + " 个网站"); //直接下载
    var userInfo = storage["store-user"];
    if (!userInfo) {
        tableToExcel('z_table', "累计 " + tb_count + " 个网站", "InfinityPro " + getCurrentDate(2));
    } else {
        var user_info = JSON.parse(userInfo).userInfo;
        if(user_info.name){
            var space = " &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
            tableToExcel('z_table', "用户:" + user_info.name + space + "共收藏 " + tb_count + " 个网站", "InfinityPro " + getCurrentDate(2));
        }
        else{
            tableToExcel('z_table', "累计 " + tb_count + " 个网站", "InfinityPro " + getCurrentDate(2));
        }
    }

    //销毁table
    document.getElementById("temp_div").remove();
}

//时间类
function getCurrentDate(format) {
    var now = new Date();
    var year = now.getFullYear(); //年份
    var month = now.getMonth();//月份
    var date = now.getDate();//日期
    var day = now.getDay();//周几
    var hour = now.getHours();//小时
    var minu = now.getMinutes();//分钟
    var sec = now.getSeconds();//秒
    month = month + 1;
    if (month < 10) month = "0" + month;
    if (date < 10) date = "0" + date;
    if (hour < 10) hour = "0" + hour;
    if (minu < 10) minu = "0" + minu;
    if (sec < 10) sec = "0" + sec;
    var time = "";
    //精确到天
    if (format == 1) {
        time = year + "-" + month + "-" + date;
    }
    //精确到分
    else if (format == 2) {
        time = year + "/" + month + "/" + date + " " + hour + ":" + minu + ":" + sec;
    }
    return time;
}


//导出excel
var tableToExcel = (function () {
    var uri = 'data:application/vnd.ms-excel;base64,',
        template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><?xml version="1.0" encoding="UTF-8" standalone="yes"?><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>',
        base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) },
        format = function (s, c) {
            return s.replace(/{(\w+)}/g,
                function (m, p) { return c[p]; })
        }
    // 直接下载
    // return function (table, name) {
    //     if (!table.nodeType) table = document.getElementById(table)
    //     var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }
    //     window.location.href = uri + base64(format(template, ctx))
    // }

    // 重命名下载文件
    return function (table, name, filename) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }

        document.getElementById("dlink").href = uri + base64(format(template, ctx));
        document.getElementById("dlink").download = filename;//这里是关键所在,当点击之后,设置a标签的属性,这样就可以更改标签的标题了
        document.getElementById("dlink").click();

    }
})()