Lambdaで作成したエクセルファイルのプロパティを確認する

Lambdaで作成したエクセルファイルのプロパティを確認する

作成者がopenpyxlになっていました。
Clock Icon2025.02.04

Lambdaでエクセルを作成したとき、エクセルのプロパティがどうなっているのか気になったので、確認してみました。

おすすめの方

  • LambdaでExcelを操作したい方
  • Lambdaで作成したエクセルファイルのプロパティを知りたい方

S3バケットやLambdaを作成する

sam init

sam init \
    --runtime python3.11 \
    --name lambda-excel-sample \
    --app-template hello-world \
    --no-tracing \
    --no-application-insights \
    --structured-logging \
    --package-type Zip

requirements.txtにopenpyxlを記載する

requirements
openpyxl

SAMテンプレート

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: lambda-excel-sample

Globals:
  Function:
    Timeout: 3
    LoggingConfig:
      LogFormat: JSON

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: blog-lambda-excel-sample-bucket

  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: blog-lambda-excel-sample-function
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.11
      Policies:
        - arn:aws:iam::aws:policy/AmazonS3FullAccess
      Environment:
        Variables:
          BUCKET_NAME: !Ref Bucket
      Architectures:
      - x86_64

  HelloWorldFunctionLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}

Lambdaコード

エクセルファイルを適当に作成し、S3バケットに保存します。

import os

import boto3

from openpyxl import Workbook

# DynamoDBなどから取得したデータを想定しています
DATA = [
    {"timestamp": 1690188000000, "temperature": 32.9, "humidity": 64},
    {"timestamp": 1690191000000, "temperature": 30.7, "humidity": 58},
    {"timestamp": 1690194000000, "temperature": 34.1, "humidity": 54},
    {"timestamp": 1690197000000, "temperature": 36.5, "humidity": 59},
    {"timestamp": 1690200000000, "temperature": 33.3, "humidity": 66},
    {"timestamp": 1690203000000, "temperature": 29.8, "humidity": 49},
]

BUCKET_NAME = os.getenv("BUCKET_NAME")
OUTPUT_FILE_NAME = "output.xlsx"

s3 = boto3.client("s3")

def lambda_handler(event, context):
    wb = Workbook()
    ws = wb.active

    ws.cell(row=1, column=1, value="timestamp")
    ws.cell(row=1, column=2, value="temperature")
    ws.cell(row=1, column=3, value="humidity")

    for i, row in enumerate(DATA, start=1):
        ws.cell(row=i, column=1, value=row["timestamp"])
        ws.cell(row=i, column=2, value=row["temperature"])
        ws.cell(row=i, column=3, value=row["humidity"])

    output_file_path = os.path.join("/tmp", OUTPUT_FILE_NAME)

    wb.save(output_file_path)

    s3.upload_file(output_file_path, BUCKET_NAME, OUTPUT_FILE_NAME)

デプロイ

sam build --use-container
sam deploy \
	--guided \
	--region ap-northeast-1 \
	--stack-name lambda-excel-sample-stack

Lambdaを実行する

aws lambda invoke \
    --function-name blog-lambda-excel-sample-function \
    output.txt

S3バケットからエクセルファイルを取得する

aws s3 cp s3://blog-lambda-excel-sample-bucket/output.xlsx output.xlsx

エクセルファイルのプロパティを確認する

エクセルを開いてプロパティを確認すると、作成者がopenpyxlになっていました。作成者以外は空白でした。

01_excel_property

最終保存者は記載がありませんでした。

02_excel_property

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.