プログラミング: 2024年11月アーカイブ

いやあ、今日は SpreadsheetGear という Excel 互換のスプレッドシート コンポーネントに振り回された一日・・・いや、半日だったけど(笑)・・・だった。

ASP.NET で開発している Web システムがあって、Web画面からアップロードした Excel ファイルをサーバサイドであれこれするんだけど、Excel ファイルによってちゃんと処理できるケースと、「Corrupt OpenXML document.」例外を発生するケースがあるのだ。

<asp:Label ID="lblExcelSel" runat="server" Text="Excelファイル"></asp:Label>&nbsp;
<asp:FileUpload ID="fileExcel" runat="server" />&nbsp;
<asp:Button ID="btnUpFile" runat="server" Text="取込" /> 

こんな感じで、FileUpload コントロールでアップしたデータを、サーバサイドで SpreadsheetGear を使って処理をする。

サーバサイドのプログラムがこんな感じ。

    ''' <summary>
    ''' 取込ボタン処理
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub btnUpFile_Click(sender As Object, e As EventArgs) Handles btnUpFile.Click

        ' ファイルがアップロードされていなければ終了
        If (fileExcel.HasFile = False) Then Return

        ' ファイルをメモリーに格納
        Dim data(fileExcel.PostedFile.ContentLength - 1) As Byte
        fileExcel.PostedFile.InputStream.Read(data, 0, fileExcel.PostedFile.ContentLength)

        Dim xlsWorkBookSet As SpreadsheetGear.IWorkbookSet = SpreadsheetGear.Factory.GetWorkbookSet()
        Dim xlsWorkBook As SpreadsheetGear.IWorkbook = Nothing
        Try
            'メモリからワークブックにセット
            xlsWorkBook = xlsWorkBookSet.Workbooks.OpenFromMemory(data)
        Catch ex As Exception
            alert("Excelファイルを読み込めませんでした。(" + ex.Message + ")")
            Return
        End Try

        Dim currentSheet As SpreadsheetGear.IWorksheet = CType(xlsWorkBook.Worksheets(0), SpreadsheetGear.IWorksheet)
<以下略>

この、xlsWorkBook = xlsWorkBookSet.Workbooks.OpenFromMemory(data) しているところで「Corrupt OpenXML document.」例外エラーが発生するのである。

色々調べていたら、他のブックからシートをコピーしたり、他のブックのシートの一部をコピー&ペーストしたファイルがエラーになるようだ。元々ちゃんと読めていたファイルが読めなくなる。

xlsx ファイルは OpenXML 形式のファイルなので、コピー元の情報を書き込んだときに、何か問題が発生するんだろうなあ。日本語ファイル名をシングルクォーテーションで囲まないとか。
まだそこまで調べてないし、調べる時間もなさそうなんで、俺よりエロい人、ぜひご教示くださいませ。

本家サイトにも色々 OpenXML 形式のファイルを扱うときの障害例が載っていたが、そのほとんどが「残念ながら、既知の制限になります。」で締められていて闇を感じた(笑)
Sourcetree で GitHub に 新規プロジェクトの main ブランチを push しようとしたら、GitHub が

git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags origin refs/heads/main:refs/heads/main 
Pushing to ssh://github.com/XXXXXXX/sXXXXXXX.git
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

というエラーを出して失敗する。
よくわからないが、どうも「Permission denied (publickey)」というメッセージから、公開鍵(PublicKey)の問題のようだ。

いや、もちろん思い当たる(^^;;;
ええと、SSH 接続用の秘密鍵も公開鍵も作ってましぇん(^^;;;

というわけで、下記に対応手順。
やり方は GitHub Docs に載っている手順通り。
この俺のブログ(このページ)も含めて(笑)、ネット上の情報は古くなっているものが多いので、GitHub Docs のような正規のドキュメントを参照した方がいいよ。

・新しい SSHキー(秘密鍵、公開鍵)の作成
※ GitHub に登録しているメールアドレスで作成
※ ディフォルトの名前を変更して作成(ケツに GitHub と付ける)

% ssh-keygen -t ed25519 -C "hogehoge@exsample.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/hogehoge/.ssh/id_ed25519): /Users/hogehoge/.ssh/id_ed25519_GitHub
Enter passphrase (empty for no passphrase): <パスフレーズ>
Enter same passphrase again: <パスフレーズ>
Your identification has been saved in /Users/hogehoge/.ssh/id_ed25519_GitHub
Your public key has been saved in /Users/hogehoge/.ssh/id_ed25519_GitHub.pub
The key fingerprint is:
SHA256:oKy<略>h4 hogehoge@exsample.com
The key's randomart image is:
+--[ED25519 256]--+
|           .=..  |
|           o.+   |
|      .    .=E   |
|   . . . ..++o.  |
|    + o S ..+.+ o|
|   o . + .   = =+|
|  o       .   B.*|
|oo.        . + X+|
|*=.         . =o=|
+----[SHA256]-----+

・ssh-agent の起動
% eval "$(ssh-agent -s)"
Agent pid 6763

・~/.ssh/config ファイルの作成
% open ~/.ssh/config
The file /Users/hogehoge/.ssh/config does not exist.

存在していないので空ファイルを作成
% touch ~/.ssh/config

・config ファイルの編集
% vi ~/.ssh/config
% cat ~/.ssh/config
Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519_GitHub

※ UseKeychain yes 行を書かなければ、キーにパスフレーズを追加しないようにできるらしい

・作成した SSH 秘密鍵を ssh-agent に追加する
% ssh-add --apple-use-keychain ~/.ssh/id_ed25519_GitHub
Enter passphrase for /Users/hogehoge/.ssh/id_ed25519_GitHub: <パスフレーズ>
Identity added: /Users/hogehoge/.ssh/id_ed25519_GitHub (hogehoge@exsample.com)

・SSH 公開鍵をクリップボードにコピー
% pbcopy < ~/.ssh/id_ed25519_GitHub.pub

※ .pub がついている公開鍵をコピーしよう。俺は .pub のついていない秘密鍵の方をコピーして GitHub から「Key is invalid. You must supply a key in OpenSSH public key format」と叱られた

・New SSH key の登録
Web で GitHub にログインし、設定画面を開く→[アクセス] セクションの[SSH キーと GPG キー]を開き、New SSH Key の登録を行う

以上の処置で、無事 push ができるようになった。
よかった、よかった(笑)

このアーカイブについて

このページには、2024年11月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2024年4月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら