0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Node.js】exceljsを使って自動でExcelに記録する

Posted at

はじめに

KG-7thの後藤です。

自動で仮想通貨を売買するアプリを作ったのですが、
為替の推移と購入・売却時の価格を記録しておかないとフィードバックができず。。
アプリ内で自動でエクセルに記載させて楽しようと思います。

ちなみに現在までの成果は1000円ほど損してます。笑ってください。

関連記事

CoinCheckのWebAPIの使い方については以下でご紹介しています。

基本仕様

  • 開発言語:Node.js + TypeScript
  • ライブラリ:exceljs

目的

以下のようなエクセルを用意しました。
(お金ないのでLibreOfficeで作成しましたが、拡張子は.xlsxにしてます)

選択範囲であるB3・C3以下に自動で値を入れていくのが目的です。

image.png

コード解説

ワークブック・ワークシートの指定

Excelファイルのパスとワークシートの名前を使います

  private EXCEL_FILE_PATH = './result.xlsx';

  // ワークブックを読み込み
  protected workbook = new ExcelJS.Workbook();
  // ワークシートを取得
  protected worksheet: Worksheet | undefined;

  /** 
   * ワークブックの取得に同期処理が必要なため、asyncを使用して初期化
   * @param worksheetName ワークシート名
   * @returns {Promise<void>} ワークブックの初期化
   * @throws {Error} ワークブックの初期化に失敗した場合
   */
  async initialize(worksheetName: "PRICE" | "BO-SELL" | "BO-BUY" | "MA-SELL" | "MA-BUY" | "RSI-SELL" | "RSI-BUY"): Promise<void> {
    try {
      // ワークブックを読み込み
      await this.workbook.xlsx.readFile(this.EXCEL_FILE_PATH);
      // ワークシートを取得
      this.worksheet = this.workbook.getWorksheet(worksheetName);
    } catch (error) {
      // エラー処理
      console.error('Error initializing Excel worksheet:', error);
    }
  }

最後の行を取得する

B3、B4、B5・・のようにどんどん値が入っていくので、
最新の一番下の行を取得する関数を作成しました。

B1は空白セルなので、startRowNumberを引数に入れることで
空白セルを飛ばして行のチェックをするようにしています。

  /**
   * 対象列の最終行を取得する
   * @param columnNumber 
   * @param startRowNumber 
   */
  getLastRowNumber(columnNumber: number, startRowNumber: number): number {
    if (!this.worksheet) {
      throw new Error('Worksheet is not initialized');
    }
    // 最終行を取得
    let lastRowNumber = 0;
    this.worksheet.eachRow((row, rowNumber) => {
      if (rowNumber < startRowNumber) {
        // 指定行より上の行はスキップ
        return;
      }
      // 指定列の値が空でない場合、最終行とする
      const cell = row.getCell(columnNumber); 
      if (cell.value !== null && cell.value !== undefined && cell.value !== '') {
        lastRowNumber = rowNumber;
      }
    });

    return lastRowNumber;
  }

テキストの入力

getCell(セルを指定).valueだけで値が設定できるらしいです。

  /**
   * テキストの入力
   * @param columnAlphabet 
   * @param rowNumber 
   * @param cellValue 
   */
  async appendCellValue(columnAlphabet: string, rowNumber: number, cellValue: number | string): Promise<void> {
    if (!this.worksheet) {
      throw new Error('Worksheet is not initialized');
    }
    // セルに値を追加
    this.worksheet.getCell(`${columnAlphabet}${rowNumber}`).value = cellValue;
    // ファイルを保存
    await this.workbook.xlsx.writeFile(this.EXCEL_FILE_PATH);
  }

終わりに

以下のリポジトリで使用しています。
もしかしたらmainブランチにはマージされてないかもです。

ExcelWorksheetAdapter.ts

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?