隨筆 20241224 ts寫入excel表

TypeScript 复制代码
// Excel2.ts
import ExcelJS2 from 'exceljs';
import fs from 'fs';
import path from 'path';

export async function writeProposalResultToExcel(
    dataList: any[], // 数据数组
    templatePath: string,
    outputPath: string
): Promise<{ success: boolean; message: string }> {
    try {
        // 检查模板文件是否存在
        if (!fs.existsSync(templatePath)) {
            throw new Error(`模板文件不存在: ${templatePath}`);
        }

        console.log(`模板文件存在,開始複製模板文件...`);
        // 複製模板文件到輸出目錄
        fs.copyFileSync(templatePath, outputPath);
        console.log(`模板文件成功拷贝到: ${outputPath}`);

        // 创建一个新的工作簿实例并读取拷贝后的文件
        const workbook = new ExcelJS2.Workbook();
        await workbook.xlsx.readFile(outputPath);

        // 获取第一个工作表
        const worksheet = workbook.worksheets[0];
        if (!worksheet) {
            throw new Error("模板文件中未找到有效的工作表");
        }

        console.log(`工作表加載成功,開始操作數據...`);

        // 複製第1到第35行,包括樣式
        for (let rowIndex = 1; rowIndex <= 35; rowIndex++) {
            const sourceRow = worksheet.getRow(rowIndex);
            const targetRow = worksheet.getRow(rowIndex + 35); // 複製到第36行起

            // 複製每一列的數據和樣式
            sourceRow.eachCell({ includeEmpty: true }, (cell, colNumber) => {
                const targetCell = targetRow.getCell(colNumber);
                targetCell.value = cell.value;

                // 複製樣式
                targetCell.style = cell.style;
            });

            targetRow.commit(); // 確保行的改動生效
        }

        console.log(`成功粘贴到第36行及以下`);

        // 保存修改后的文件
        await workbook.xlsx.writeFile(outputPath);

        return { success: true, message: `数据已成功写入文件: ${outputPath}` };
    } catch (error) {
        console.error("写入 Excel 时发生错误:", error);
        return { success: false, message: error instanceof Error ? error.message : "未知错误" };
    }
}

export default ExcelJS2;

//test02.ts

TypeScript 复制代码
import DbConnect from './common/DbConnect';
import { User } from "./entity/User";
import logger from './config/log4js-config';
import { User2 } from "./entity/User2";
import { writeProposalResultToExcel } from './common/Excel2';



async function testTransaction() {
  await DbConnect.initialize();

  async function sqlSelect() {
    try {
      const result = await DbConnect.findMany(User2);
      // console.log('data:', result);
      // 在這裏調用   模板地址 E:\templ.xlsx,輸出地址自己選擇,名字也要自己寫
      const templatePath = 'E:\\templ.xlsx'; // 替換為實際模板路徑
      const outputPath = 'E:\\output\\result.xlsx'; // 替換為實際輸出路徑
      const writeResult = await writeProposalResultToExcel(result, templatePath, outputPath);

      // 打印結果
      if (writeResult.success) {
        console.log(writeResult.message);
      } else {
        console.error('Failed to write Excel:', writeResult.message);
      }
    } catch (error) {
      logger.error("Error executing select: ", error); // エラーログを記録
      console.error('Error: ', error);
    }
  }
  sqlSelect()

}

// running
testTransaction().catch((error) => {
  console.error('Test failed', error);
});
相关推荐
kyriewen9 分钟前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
ooseabiscuit11 分钟前
Laravel4.x:现代PHP框架的奠基之作
java·开发语言·php
问心无愧051330 分钟前
ctf show web 入门42
android·前端·android studio
c1s2d3n4cs1 小时前
Qt模仿nlohmann::json进行序列化和反序列化
开发语言·qt·json
kyriewen1 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u1 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby1 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情6731 小时前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇1 小时前
前端转后端:SQL 是什么
前端
AiTop1001 小时前
Claude Code 推出 Agent View:命令行编程正式进入“多线程并发“时代
开发语言·人工智能·ai·aigc