likes
comments
collection
share

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密

作者站长头像
站长
· 阅读数 10

本文将通过Node.js使用exceljs模块,读取EXCEL中主题配色,获取对应的RGB或主题颜色值。 首先我们需要创建一个EXCEL并使用填充颜色,在EXCEL中挑一块区域复刻主题颜色+标准颜色块,放入单元格。

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密

(10分钟) 编写主函数代码读取EXCEL内容。

const ExcelJS = require('exceljs')// npm install exceljs

读取EXCEL()

async function 读取EXCEL() {
    const 工作簿 = new ExcelJS.Workbook()
    await 工作簿.xlsx.readFile('主题色.xlsx') 
    
    const 工作表 = 工作簿.worksheets[0]
}//读取EXCEL

(10分钟)观察自己的颜色区域 所在单元格 行和列。

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密 定义 行和列的数组。使用双重循环获得所有颜色的单元格位置 的数组arr, 在第9行下方增加以下代码:

    let 列数组 = ['B','C','D','E','F', 'H','I','J','K','L']
    let 行数组 = [  4,5,6,7,8,  10]

    let arr =[]
    for(letof 行数组){
        for(letof 列数组){
            let 位置 = `${列}${行}`
            arr.push(位置)
        }
    } 
    console.log(arr)

运行代码效果如下图:

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密 注意:请检查显示结果是否和实际EXCEL相符。

(15分钟) 根据位置数组,打印单元格的样式

现在已经获得了所有单元格的坐标,在循环的过程中,同时也在遍历单元格。 因此可以直接在循环中处理打印单元格的样式。调整代码为:

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密

通过显示数据,我们发现EXCEL中存在两种fgColor样式类型: 1.fgColor: { theme: 9, tint: -0.499984740745262 } 2.fgColor: { argb: 'FFFF0000' } 结论:通过主题颜色填充的,具备theme和tint,不能直接获取其RGB值。 仅第10行 标准色是ARGB颜色。 在编程处理时要注意区分。

const ExcelJS = require('exceljs')// npm install exceljs
读取EXCEL()

async function 读取EXCEL() {
    const 工作簿 = new ExcelJS.Workbook()
    await 工作簿.xlsx.readFile('主题色.xlsx') 
    const 工作表 = 工作簿.worksheets[0]

    let 列数组 = ['B','C','D','E','F', 'H','I','J','K','L']
    let 行数组 = [  4,5,6,7,8,  10]

    let arr =[]
    for(letof 行数组){
        for(letof 列数组){
            let 位置 = `${列}${行}`
            let 单元格 = 工作表.getCell(位置)
            console.log(位置 , 单元格.style.fill )
        }
    } 
    
}//读取EXCEL

(20分钟) 将单元格十六进制颜色值写入

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密

const ExcelJS = require('exceljs')// npm install exceljs
读取EXCEL()

async function 读取EXCEL() {
    const 工作簿 = new ExcelJS.Workbook()
    await 工作簿.xlsx.readFile('主题色.xlsx') 
    const 工作表 = 工作簿.worksheets[0]

    let 列数组 = ['B','C','D','E','F', 'H','I','J','K','L']
    let 行数组 = [  4,5,6,7,8,  10]

    let arr =[]
    for(letof 行数组){
        for(letof 列数组){
            let 位置 = `${列}${行}`
            let 单元格 = 工作表.getCell(位置)
            console.log(位置 , 单元格.style.fill )
                    //  因为设置主题颜色的单元格 无argb属性
                    //?? 判断值argb是否存在,存在取argb,否则取 ''
            let argb = 单元格.style.fill.fgColor.argb ?? ''
                         //将颜色的值写入单元格,并截取后6位RGB
            单元格.value = argb.substr(2)    
            
        }
    } 
    
    let 文件路径 = `主题色16进制.xlsx`
    await 工作簿.xlsx.writeFile(文件路径) 
    console.log(`生成文件 ${文件路径}  成功`)


}//读取EXCEL


样式显示结果: Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密 思考:如何将所有主题色全部写入单元格。

(15分钟) [进阶] 将全部主题颜色(theme+tint)写入

根据EXCEL中翻译:theme为个性色 , tint为淡色/深色百分比。例如:

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密 fgColor: { theme: 6, tint: 0.4 } 为金色 个性色 淡色40% fgColor: { theme: 7, tint: -0.25 } 为金色 个性色 深色40%

发现目标数据特征值,完成最小化测试用例:

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密

在主函数中进行修改,最终代码:

const ExcelJS = require('exceljs')// npm install exceljs
读取EXCEL()

async function 读取EXCEL() {
    const 工作簿 = new ExcelJS.Workbook()
    await 工作簿.xlsx.readFile('主题色.xlsx') 
    const 工作表 = 工作簿.worksheets[0]

    let 列数组 = ['B','C','D','E','F', 'H','I','J','K','L']
    let 行数组 = [  4,5,6,7,8,  10]

    let arr =[]
    for(letof 行数组){
        for(letof 列数组){
            let 位置 = `${列}${行}`
            let 单元格 = 工作表.getCell(位置)
            
            let obj = 单元格.fill   //注意此处
            let color = obj?.fgColor?.theme ?? obj?.fgColor?.argb?.substr(2);  
            let tint  = obj?.fgColor?.tint?.toFixed(2) ?? '' 
            
            单元格.value = `${color} ${tint}`

        }
    } 
    
    let 文件路径 = `主题色16进制.xlsx`
    await 工作簿.xlsx.writeFile(文件路径) 
    console.log(`生成文件 ${文件路径}  成功`)


}//读取EXCEL

Node.js遍历EXCEL彩色单元格,深入挖掘配色的秘密