{"id":21205943,"url":"https://github.com/tatsuya-midorikawa/fxcel","last_synced_at":"2026-03-10T05:03:52.875Z","repository":{"id":48377718,"uuid":"376537631","full_name":"tatsuya-midorikawa/Fxcel","owner":"tatsuya-midorikawa","description":"Excel COM Wrapper Library for F#","archived":false,"fork":false,"pushed_at":"2021-11-21T12:50:58.000Z","size":768,"stargazers_count":20,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-20T06:45:57.229Z","etag":null,"topics":["excel","fsharp"],"latest_commit_sha":null,"homepage":"","language":"F#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tatsuya-midorikawa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":["fffsharp"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2021-06-13T12:25:58.000Z","updated_at":"2024-05-11T16:57:37.000Z","dependencies_parsed_at":"2022-09-02T21:51:19.528Z","dependency_job_id":null,"html_url":"https://github.com/tatsuya-midorikawa/Fxcel","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tatsuya-midorikawa%2FFxcel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tatsuya-midorikawa%2FFxcel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tatsuya-midorikawa%2FFxcel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tatsuya-midorikawa%2FFxcel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tatsuya-midorikawa","download_url":"https://codeload.github.com/tatsuya-midorikawa/Fxcel/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225629898,"owners_count":17499294,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["excel","fsharp"],"created_at":"2024-11-20T20:53:46.836Z","updated_at":"2026-03-10T05:03:52.830Z","avatar_url":"https://github.com/tatsuya-midorikawa.png","language":"F#","funding_links":["https://github.com/sponsors/fffsharp"],"categories":[],"sub_categories":[],"readme":"# Fxcel - Excel operations library  \n\n![Fxcel](https://raw.githubusercontent.com/tatsuya-midorikawa/Fxcel/main/assets/fxcel.png)  \n\n\n## 🔷 What's this?  \n\n- Fxcel は F# で簡単に Excel の COM 操作をするためのライブラリです。  \n  - C# 向けの Excel COM 操作ライブラリである ***[Midoliy.Office.Interop.Excel](https://github.com/Midoliy/Midoliy.Office.Interop.Excel)*** のラッパーライブラリとなります。\n- .NET 5.0 以上の環境をサポートしています。  \n- 主に F# Script や F# Interactive での利用を想定して設計をしていますが、Console アプリや Desktop アプリでも問題なく利用可能です。  \n- COM を利用するため Excel のインストールが必要です。  \n\n---\n\n## 🔷 Get started  \n\n### ◼◻ F# Interactiveで利用する\n\n#### 1. FSIを起動する  \n\n```powershell\ndotnet fsi\n```\n\n#### 2. Fxcel を読み込む\n\nFxcel を nuget から読み込みます。\n\n```fsharp\n#r \"nuget: Fxcel, 0.0.21\";;\nopen Fxcel;;\n```  \n\n### ◼◻ F# Scriptで利用する\n\n#### 1. **.fsx** ファイルを作成する  \n\nまずはコーディングを始めるために **main.fsx** を作成して、VSCode で開きましょう。  \n\n```powershell\nmkdir D:/work\ncd D:/work\nnew-item main.fsx\ncode D:/work\n```\n\n#### 2. Fxcel を読み込む\n\n**main.fsx** に Fxcel を利用するためのコードを追加します。\n\n```fsharp\n#r \"nuget: Fxcel\"\nopen Fxcel\n```  \n\n### ◼◻ F# プロジェクトで利用する\n\n#### 1. 新規プロジェクトを作成する  \n\n```powershell\nmkdir D:/work\ncd D:/work\ndotnet new console -lang=F# -o=FxcelSample\n``` \n#### 2. Fxcel を読み込む \n\n```powershell\ncd D:/work/FxcelSample\ndotnet add package Fxcel\n``` \n\n---\n\n## 🔷 Reference for F# Interactive\n\n### ◼◻ 起動中のExcelプロセス一覧をターミナルに表示しつつ取得する\u003cbr\u003e`show ()`\n\n```fsharp\nlet processList = show ();;\n```\n\n### ◼◻ 起動中のExcelプロセス一覧を取得する\u003cbr\u003e`enumerate ()`\n\n```fsharp\nlet processList = enumerate ();;\n```\n\n### ◼◻ 起動中のExcelプロセスにアタッチする\u003cbr\u003e`attach (excel: Handle)`\n\n```fsharp\nlet processList = enumerate ();;\nlet excel = processList.[0] |\u003e attach;;\n```\n\n### ◼◻ アタッチ済みのExcelプロセスをデタッチする\u003cbr\u003e`detach (excel: IExcelApplication)`\n\n```fsharp\nlet processList = enumerate ();;\nlet excel = processList.[0] |\u003e attach;;\n\n// do somethings\n\nexcel |\u003e detach;;\n```\n\n---\n\n## 🔷 Reference  \n\n### ◼◻ Workbookを新規作成する\u003cbr\u003e`create (): IExcelApplication`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = create ()\n```\n\n### ◼◻ 既存Workbookをテンプレートとして新規Workbookを作成する\u003cbr\u003e`create (template: string): IExcelApplication`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = create \"C:/work/sample.xlsx\"\n```\n\n### ◼◻ 既存Workbookを開く\u003cbr\u003e`open' (filepath: string): IExcelApplication`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n```\n\n### ◼◻ Workbookを名前を付けて保存する\u003cbr\u003e`saveAs (filepath: string) (excelObject: ^ExcelObject): unit`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  // Workbookを新規作成し, ExcelApplicationを取得.\n  use excel = create()\n\n  // (1) Workbookを利用して, 名前を付けて保存.\n  let book = excel |\u003e workbook(1)\n  // do somethings\n  book |\u003e saveAs \"C:/work/sample.xlsx\"\n\n  // (2) Worksheetを利用して, 名前を付けて保存.\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n  // do somethings\n  sheet |\u003e saveAs \"C:/work/sample.xlsx\"\n```\n\n### ◼◻ Workbookを上書き保存する\u003cbr\u003e`save (excelObject: ^ExcelObject): unit`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  // 既存のExcelワークブックを開く.\n  use excel = open' \"C:/work/sample.xlsx\"\n\n  // (1) Workbookを利用して, 上書き保存.\n  let book = excel |\u003e workbook(1)\n  // do somethings\n  book |\u003e save\n\n  // (2) Worksheetを利用して, 上書き保存.\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n  // do somethings\n  sheet |\u003e save\n```\n\n### ◼◻ Workbookを取得する\u003cbr\u003e`workbook (index: int) (excel: IExcelApplication): IWorkbook`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n\n  // indexを指定してWorkbookを取得.\n  //   -\u003e index は 1 始まりであることに注意する.\n  let book = excel |\u003e workbook(1)\n```\n\n### ◼◻ Worksheetを取得する\u003cbr\u003e`worksheet (index: int | string) (workbook: IWrokbook): IWorksheet`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n\n  // (1) indexを指定してWorksheetを取得.\n  //   -\u003e index は 1 始まりであることに注意する.\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // (2) sheet nameを指定して取得.\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(\"Sheet1\")\n```\n\n### ◼◻ Worksheetを新規追加する\u003cbr\u003e`newsheet (book: IWorkbook): IWorksheet`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e newsheet\n```\n\n### ◼◻ IExcelRangeオブジェクトを取得する\u003cbr\u003e`sheet.[address]: IExcelRange`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // (1) アドレス形式で取得.\n  let cell = sheet.[\"A1\"]\n  // (2) R1C1形式で取得.\n  let cell = sheet.[1, 1]\n  // (3) 範囲をアドレス形式で取得.\n  let range = sheet.[\"A1:B3\"]\n  // (4) 範囲を始点セルアドレスと終点セルアドレスを指定して取得.\n  let range = sheet.[\"A1\", \"B3\"]\n```\n\n### ◼◻ IWorksheetから行を取得する\u003cbr\u003e`get'row (index: int) (sheet: IWorksheet): IExcelRow`\u003cbr\u003e`get'rows (begin': int, end': int) (sheet: IWorksheet): IExcelRows`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 1行取得.\n  let r = sheet |\u003e get'row(1)       // $1:$1\n  // 複数行取得.\n  let r = sheet |\u003e get'rows(1, 3)   // $1:$3\n```\n\n### ◼◻ IWorksheetから列を取得する\u003cbr\u003e`get'column (index: int) (sheet: IWorksheet): IExcelRow`\u003cbr\u003e`get'columns (begin': int, end': int) (sheet: IWorksheet): IExcelRows`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 1列取得.\n  let c = sheet |\u003e get'column(1)       // $A:$A\n  // 複数列取得.\n  let c = sheet |\u003e get'columns(1, 3)   // $A:$C\n```\n\n### ◼◻ IExcelRangeの行全体を取得する\u003cbr\u003e`current'rows (range: IExcelRange): IExcelRows`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 行全体を取得.\n  let r = sheet.[\"A1\"] |\u003e current'rows      // $1:$1\n  let r = sheet.[\"A1:B3\"] |\u003e current'rows   // $1:$3\n```\n\n### ◼◻ IExcelRangeの列全体を取得する\u003cbr\u003e`current'columns (range: IExcelRange): IExcelColumns`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 列全体を取得.\n  let r = sheet.[\"A1\"] |\u003e current'columns      // $A:$A\n  let r = sheet.[\"A1:B3\"] |\u003e current'columns   // $A:$B\n```\n\n### ◼◻ 範囲データを行ごとに列挙する\u003cbr\u003e`rows (range: IExcelRange): seq\u003cIExcelRow\u003e`\u003cbr\u003e`rowsi (range: IExcelRange): seq\u003cint * IExcelRow\u003e`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // rows関数を利用して, 1行ずつ取得.\n  for row in sheet.[\"A1:B3\"] |\u003e rows do\n    // 各Cell毎に何か処理.\n    for cell in row do\n      // do somethings\n\n\n  // rowsi関数を利用して, インデックス付きで1行ずつ取得.\n  //   -\u003e index は 1 始まりであることに注意.\n  for (index, row) in sheet.[\"A1:B3\"] |\u003e rowsi do\n    // 各Cell毎に何か処理.\n    for cell in row do\n      // do somethings\n```\n\n### ◼◻ 範囲データを列ごとに列挙する\u003cbr\u003e`columns (range: IExcelRange): seq\u003cIExcelColumn\u003e`\u003cbr\u003e`columnsi (range: IExcelRange): seq\u003cint * IExcelColumn\u003e`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // columns関数を利用して, 1行ずつ取得.\n  for column in sheet.[\"A1:B3\"] |\u003e columns do\n    // 各Cell毎に何か処理.\n    for cell in column do\n      // do somethings\n\n\n  // columnsi関数を利用して, インデックス付きで1行ずつ取得.\n  //   -\u003e index は 1 始まりであることに注意.\n  for (index, column) in sheet.[\"A1:B3\"] |\u003e columnsi do\n    // 各Cell毎に何か処理.\n    for cell in column do\n      // do somethings\n```\n\n### ◼◻ 値を取得する\u003cbr\u003e`get (cell: IExcelRange): obj`\u003cbr\u003e`get\u003c'T\u003e (cell: IExcelRange): 'T`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 値を取得.\n  let v: obj = sheet.[\"A1\"] |\u003e get\n\n  // 値を型付きで取得.\n  //   -\u003e 指定した型と互換性がない場合, System.InvalidCastException.\n  let v: int = sheet.[\"A1\"] |\u003e get\u003cint\u003e\n\n  // 複数要素がある場合は先頭要素の値のみ取得.\n  //   -\u003e 以下の場合 sheet.[\"A1\"] の値が得られる.\n  let v: obj = sheet.[\"A1:B3\"] |\u003e get\n\n  // 複数要素がある場合は先頭要素の型付きの値のみ取得.\n  //   -\u003e 以下の場合 sheet.[\"A1\"] の値が得られる.\n  //   -\u003e 指定した型と互換性がない場合, System.InvalidCastException.\n  let v: int = sheet.[\"A1:B3\"] |\u003e get\u003cint\u003e\n```\n\n### ◼◻ 値を配列データで取得する\u003cbr\u003e`gets (range: IExcelRange): obj [,]`\u003cbr\u003e`gets\u003c'T\u003e (range: IExcelRange): 'T [,]`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 値を配列データとして取得.\n  let vs: obj [,]  = sheet.[\"A1:A3\"] |\u003e gets\n\n  // 値を型付きの配列データとして取得.\n  //   -\u003e 指定した型と互換性がない場合, System.InvalidCastException.\n  let vs: int [,]  = sheet.[\"A1:A3\"] |\u003e gets\u003cint\u003e\n\n  // 取得した配列データから先頭要素の値を取得.\n  //   -\u003e 以下の場合 sheet.[\"A1\"] の値が得られる.\n  let v: obj = sheet.[\"A1:B3\"] |\u003e gets |\u003e head\n\n  // 取得した型付きの配列データから先頭要素の値を取得.\n  //   -\u003e 以下の場合 sheet.[\"A1\"] の値が得られる.\n  //   -\u003e 指定した型と互換性がない場合, System.InvalidCastException.\n  let v: int = sheet.[\"A1:B3\"] |\u003e gets\u003cint\u003e |\u003e head\n\n  // 取得した配列データから末尾要素の値を取得.\n  //   -\u003e 以下の場合 sheet.[\"B3\"] の値が得られる.\n  let v: obj = sheet.[\"A1:B3\"] |\u003e gets |\u003e last\n\n  // 取得した型付きの配列データから末尾要素の値を取得.\n  //   -\u003e 以下の場合 sheet.[\"B3\"] の値が得られる.\n  //   -\u003e 指定した型と互換性がない場合, System.InvalidCastException.\n  let v: int = sheet.[\"A1:B3\"] |\u003e gets\u003cint\u003e |\u003e last\n```\n\n### ◼◻ 関数を取得する\u003cbr\u003e`getfx (cell: IExcelRange): string`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 関数を取得.\n  let fn: string = sheet.[\"A1\"] |\u003e getfx\n```\n\n### ◼◻ 関数を配列データで取得する\u003cbr\u003e`getsfx (range: IExcelRange): string [,]`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 関数を配列データで取得.\n  let fns: string [,] = sheet.[\"A1:A3\"] |\u003e getsfx\n```\n\n### ◼◻ 値を設定する\u003cbr\u003e`set (value: obj) (target: IExcelRange): unit`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 値を設定.\n  sheet.[\"A1\"] |\u003e set 100\n  sheet.[\"A1:B3\"] |\u003e set 100\n```\n\n### ◼◻ 関数を設定する\u003cbr\u003e`fx (func: string) (target: IExcelRange): unit`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 関数を設定.\n  sheet.[\"A1\"] |\u003e fx \"SUM(A2:A5)\"\n  sheet.[\"A1:B3\"] |\u003e fx \"COUNT(A1:B3)\"\n```\n\n### ◼◻ 背景色を設定する\u003cbr\u003e`bgcolor (color: Color) (target: IExcelRange): unit`\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 背景色を設定.\n  sheet.[\"A1\"] |\u003e bgcolor Color.Red\n  sheet.[\"B1:B3\"] |\u003e bgcolor Color.Blue\n  sheet.[\"C1\"] |\u003e bgcolor (rgb(0, 128, 255))\n```\n\n### ◼◻ 背景パターンを設定する\u003cbr\u003e`bgpattern (pattern: Pattern) (target: IExcelRange): unit`\n\n| arg name | values |\n| --- | --- |\n| pattern | `pattern'none`\u003cbr\u003e`pattern'auto`\u003cbr\u003e`pattern'up`\u003cbr\u003e`pattern'down`\u003cbr\u003e`pattern'vertical`\u003cbr\u003e`pattern'horizontal`\u003cbr\u003e`pattern'lightUp`\u003cbr\u003e`pattern'lightDown`\u003cbr\u003e`pattern'lightVertical`\u003cbr\u003e`pattern'lightHorizontal`\u003cbr\u003e`pattern'gray8`\u003cbr\u003e`pattern'gray16`\u003cbr\u003e`pattern'gray25`\u003cbr\u003e`pattern'gray50`\u003cbr\u003e`pattern'gray75`\u003cbr\u003e`pattern'semigray75`\u003cbr\u003e`pattern'solid`\u003cbr\u003e`pattern'checker`\u003cbr\u003e`pattern'grid`\u003cbr\u003e`pattern'crisscross`\u003cbr\u003e`pattern'linearGradient`\u003cbr\u003e`pattern'rectangularGradient` |\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 背景パターンを設定.\n  sheet.[\"A1\"] |\u003e bgpattern pattern'checker\n  sheet.[\"B1:B3\"] |\u003e bgpattern pattern'crisscross\n```\n\n### ◼◻ 罫線を設定する\u003cbr\u003e`ruledline (target: IExcelRange): IBorders` コンピュテーション式\n\n#### 📑 `ruledline` で利用できるカスタムオペレーション\n\n| operation name | description |\n| --- | --- |\n| `top (border)` | 最上部の横罫線. |\n| `bottom (border)` | 最下部の横罫線. |\n| `left (border)` | 最左部の縦罫線. |\n| `right (border)` | 最右部の縦罫線. |\n| `horizontal (border)` | 中間部の横罫線. |\n| `vertical (border)` | 中間部の縦罫線. |\n| `growing (border)` | 左下から右上に向けての罫線. 色や太さの設定は `falling` と共有. |\n| `falling (border)` | 左上から右下に向けての罫線. 色や太さの設定は `growing` と共有. |\n\n#### 📑 `Border` に設定できる値\n\n| operation name | description | values |\n| --- | --- | --- |\n| `LineStyle` | 罫線のスタイル.\u003cbr\u003e**default: `linestyle'continuous`** | `linestyle'none`\u003cbr\u003e`linestyle'dot`\u003cbr\u003e`linestyle'double`\u003cbr\u003e`linestyle'dash`\u003cbr\u003e`linestyle'continuous`\u003cbr\u003e`linestyle'dashdot`\u003cbr\u003e`linestyle'dashdotdot`\u003cbr\u003e`linestyle'slant`|\n| `Weight` | 罫線の太さ.\u003cbr\u003e**default: `weight'medium`** | `weight'medium`\u003cbr\u003e`weight'hairline`\u003cbr\u003e`weight'thin`\u003cbr\u003e`weight'thick` |\n| `Color` | 罫線の色.\u003cbr\u003e**default: `Color.Black`** | `Color.Red`\u003cbr\u003e`Color.Orange`\u003cbr\u003e`Color.Blue`\u003cbr\u003e`rgb(r, g, b)`\u003cbr\u003eand more... |\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // 罫線を設定.\n  ruledline sheet.[\"B2:C5\"] {\n    // 各 Border の値は with を利用して指定.\n    top { border with Color= Color.Red }\n    left { border with Color= Color.Orange; Weight= weight'thick }\n    right { border with LineStyle= linestyle'dashdot }\n    bottom { border with Weight= weight'medium }\n    horizontal { border with Color= Color.Blue; Weight= weight'medium }\n    vertical { border with Color= rgb (0, 128, 255); Weight= weight'thin }\n\n    // growing と falling は値がExcel内部で共有されているため、設定値は後勝ちする.\n    growing { border with Weight= weight'hairline }\n    falling { border with Weight= weight'thick }\n  }\n  |\u003e ignore\n```\n\n### ◼◻ フォントを設定する / `font (target: IExcelRange): IRangeFont` コンピュテーション式\n\n#### 📑 `font` で利用できるカスタムオペレーション\n\n| operation name | description | values |\n| --- | --- | --- |\n| `set (fontName: string)`\u003cbr\u003e`name (fontName: string)` | フォント名. | `游ゴシック`\u003cbr\u003e`メイリオ`\u003cbr\u003e`consolas`\u003cbr\u003eand more... |\n| `set (size: float)`\u003cbr\u003e`size (size: float)` | フォントサイズ. | `8.0`\u003cbr\u003e`10.5`\u003cbr\u003e`24.0`\u003cbr\u003eand more... |\n| `set (style: FontStyle)` | フォントスタイル. `Flags` なので複数まとめて指定可能. | `style'normal`\u003cbr\u003e`style'bold`\u003cbr\u003e`style'italic'`\u003cbr\u003e`style'shadow`\u003cbr\u003e`style'strikethrough`\u003cbr\u003e`style'subscript`\u003cbr\u003e`style'superscript`\u003cbr\u003e`style'singleUnderline`\u003cbr\u003e`style'doubleUnderline` |\n| `set (value: Color)` | フォント色. | `Color.Red`\u003cbr\u003e`Color.Orange`\u003cbr\u003e`Color.Blue`\u003cbr\u003eand more... |\n| `set (value: RGB)` | フォント色. | `rgb(r: int, g: int, b: int)`\u003cbr\u003e`{ r= 0; g= 128; b= 255; }` |\n| `set (style: Underline)` | 下線. | `underline'none`\u003cbr\u003e`underline'double`\u003cbr\u003e`underline'doubleAccounting`\u003cbr\u003e`underline'single`\u003cbr\u003e`underline'singleAccounting` |\n| `bold (on: bool)` | 太字. | `true` or `false` |\n| `italic (on: bool)` | イタリック体. | `true` or `false` |\n| `shadow (on: bool)` | フォント影. | `true` or `false` |\n| `outline (on: bool)` | アウトラインフォント. | `true` or `false` |\n| `strikethrough (on: bool)` | 打ち消し線. | `true` or `false` |\n| `subscript (on: bool)` | 下付き文字にする. | `true` or `false` |\n| `superscript (on: bool)` | 上付き文字にする. | `true` or `false` |\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n\n  // フォントを設定.\n  font sheet.[\"A1:A3\"] {\n    // フォントの指定.\n    set \"メイリオ\"  // or\n    name \"メイリオ\"\n    // フォントサイズの設定.\n    set 16.0  // or\n    size 16.0\n    // 下線の設定.\n    set underline'double\n\n    // フォント色の設定.\n    set Color.Orange          // or\n    set ( rgb(0, 128, 255) )  // or\n    set { r= 0; g= 128; b= 255; }\n\n    // フォントスタイルの設定.\n    set style'normal\n    // スタイルを複数選択する場合は以下のように指定.\n    set (style'normal ||| style'strikethrough ||| style'shadow)\n    // style を直接指定しなくとも各種スタイルをひとつずつ ON/OFF 可能.\n    bold true\n    italic true\n    shadow true\n    outline true\n    strikethrough true\n    subscript true\n    superscript true\n  }\n  |\u003e ignore\n```\n\n### ◼◻ IExcelApplicationオブジェクトを操作する\u003cbr\u003e`excel'op (excel: IExcelApplication)` コンピュテーション式\n\n#### 📑 `excel'op` で利用できるカスタムオペレーション\n\n| operation name | description | values |\n| --- | --- | --- |\n| `set (mode: Calculation)` | Excelの再計算制御を設定する.\u003cbr\u003e**default: `calc'manual`** | `calc'auto`\u003cbr\u003e`calc'manual`\u003cbr\u003e`calc'semiauto` |\n| `set (visibility: AppVisibility)` | Excelの表示状態を設定する.\u003cbr\u003e**default: `visibility'hidden`** | `visibility'visible`\u003cbr\u003e`visibility'hidden` |\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  \n  excel'op excel {\n    set calc'semiauto\n    set visibility'visible\n  }\n```\n\n### ◼◻ IExcelRangeオブジェクトを操作する（コピー・ペースト・挿入・削除など）\u003cbr\u003e`sheet'op (sheet): IWorksheet)` コンピュテーション式\n\n#### 📑 `sheet'op` で利用できるカスタムオペレーション\n\n| operation name | description | values |\n| --- | --- | --- |\n| `copy (target: string)` | 対象をクリップボードにコピーする. | - |\n| `paste (target: string, pasteMode: PasteMode)` | 対象にクリップボードの値を貼り付ける. | - |\n| `insert (target: string, insertMode: InsertMode)` | 対象にクリップボードの値を挿入する. | - |\n| `delete (target: string, deleteMode: DeleteMode)` | 対象を削除する. | - |\n| `set (target: string, value: obj)` | 対象に値を設定する. | - |\n| `set (target: string, color: Color)` | 対象の背景色を設定する. | `Color.Red`\u003cbr\u003e`Color.Orange`\u003cbr\u003e`Color.Blue`\u003cbr\u003eand more... |\n| `set (target: string, theme: ThemeColor)` | 対象の背景色をテーマカラーで設定する. | `theme'background1`\u003cbr\u003e`theme'background2`\u003cbr\u003e`theme'foreground1`\u003cbr\u003e`theme'foreground2`\u003cbr\u003e`theme'accent1`\u003cbr\u003e`theme'accent2`\u003cbr\u003e`theme'accent3`\u003cbr\u003e`theme'accent4`\u003cbr\u003e`theme'accent5`\u003cbr\u003e`theme'accent6`\u003cbr\u003e |\n| `set (target: string, pattern: Pattern)` | 対象の背景パターンを設定する. | `pattern'none`\u003cbr\u003e`pattern'auto`\u003cbr\u003e`pattern'up`\u003cbr\u003e`pattern'down`\u003cbr\u003e`pattern'vertical`\u003cbr\u003e`pattern'horizontal`\u003cbr\u003e`pattern'lightUp`\u003cbr\u003e`pattern'lightDown`\u003cbr\u003e`pattern'lightVertical`\u003cbr\u003e`pattern'lightHorizontal`\u003cbr\u003e`pattern'gray8`\u003cbr\u003e`pattern'gray16`\u003cbr\u003e`pattern'gray25`\u003cbr\u003e`pattern'gray50`\u003cbr\u003e`pattern'gray75`\u003cbr\u003e`pattern'semigray75`\u003cbr\u003e`pattern'solid`\u003cbr\u003e`pattern'checker`\u003cbr\u003e`pattern'grid`\u003cbr\u003e`pattern'crisscross`\u003cbr\u003e`pattern'linearGradient`\u003cbr\u003e`pattern'rectangularGradient` |\n| `set (target: string, halign: HorizontalAlignment)` |文字の水平位置を設定する. | `h'right`\u003cbr\u003e`h'left`\u003cbr\u003e`h'center`\u003cbr\u003e`h'justify`\u003cbr\u003e`h'distributed`\u003cbr\u003e`h'general`\u003cbr\u003e`h'fill`\u003cbr\u003e`h'centerAcrossSelection` |\n| `set (target: string, valign: VerticalAlignment)` |文字の垂直位置を設定する. | `v'top`\u003cbr\u003e`v'bottom`\u003cbr\u003e`v'center `\u003cbr\u003e`v'justify`\u003cbr\u003e`v'distributed` |\n| `fx (target: string, formula: string)` | 対象に関数を設定する. | - |\n| `width (target: string, length: int)` | 対象の列幅をpt単位で設定する. | - |\n| `height (target: string, length: int)` | 対象の行高をpt単位で設定する. | - |\n| `fit'width (target: string)` | 対象の列幅を自動調整する. | - |\n| `fit'height (target: string)` | 対象の行高を自動調整する. | - |\n| `merge (target: string, across: bool)` | セルを結合する. | `true`: 範囲内のセルを行ごとに結合.\u003cbr\u003e`false`: 範囲内すべてのセルを1つに結合. |\n| `unmerge (target: string)` | セルの結合を解除する. | - |\n| `wrap (target: string)` | 折り返して全体を表示する. | - |\n| `unwrap (target: string)` | 折り返して全体を表示を解除する. | - |\n| `shrink (target: string)` | 縮小して全体を表示する. | - |\n| `unshrink (target: string)` | 縮小して全体を表示を解除する. | - |\n| `orientation (target: string, angle: int)` | 文字の方向を設定する. | -90° ~ 90° |\n| `format (target: string, format: string)` | セルの値の表示形式を設定する. | - |\n\n#### 📑 `PasteMode` の要素\n\n| name | description | values |\n| --- | --- | --- |\n| `Paste` | 貼り付け方式.\u003cbr\u003e**default: `paste'all`** | `paste'values`\u003cbr\u003e`paste'comments`\u003cbr\u003e`paste'formulas`\u003cbr\u003e`paste'formats`\u003cbr\u003e`paste'all`\u003cbr\u003e`paste'validation`\u003cbr\u003e`paste'exceptBorders`\u003cbr\u003e`paste'colmnWidths`\u003cbr\u003e`paste'formulasAndNumberFormats`\u003cbr\u003e `paste'valuesAndNumberFormats`\u003cbr\u003e`paste'allUsingSourceTheme`\u003cbr\u003e`paste'allMergingConditionalFormats` |\n| `Op` | 貼り付け時の演算方法.\u003cbr\u003e**default: `op'none`** | `op'none`\u003cbr\u003e`op'add`\u003cbr\u003e`op'sub`\u003cbr\u003e`op'mul`\u003cbr\u003e`op'div` |\n| `SkipBlanks` | 空白セルを無視するか.\u003cbr\u003e**default: `false`** | `true` or `false` |\n| `Transpose` | 行列を入れ替えるか.\u003cbr\u003e**default: `false`** | `true` or `false` |\n\n#### 📑 `InsertMode` の要素\n\n| name | description | values |\n| --- | --- | --- |\n| `Shift` | 挿入後に他のセルをどうシフト移動するか.\u003cbr\u003e**default: `shift'down`** | `shift'right`\u003cbr\u003e`shift'down` |\n| `Origin` | 書式をコピーしてくる方向.\u003cbr\u003e**default: `origin'right`, `origin'below`** | `origin'left`\u003cbr\u003e`origin'above`\u003cbr\u003e`origin'right`\u003cbr\u003e`origin'below` |\n\n#### 📑 `DeleteMode` の要素\n\n| name | description | values |\n| --- | --- | --- |\n| `Shift` | 削除後に他のセルをどうシフト移動するか. | `shift'left`\u003cbr\u003e`shift'up` |\n\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n  \n  sheet'op sheet {\n    // A1 をクリップボードにコピー.\n    copy \"A1\"\n    // 範囲コピーも可能.\n    copy \"A1:A3\"\n\n    // クリップボードのデータを B1 に貼り付け.\n    paste \"B1\" paste'mode\n    paste \"B1\" { paste'mode with Paste= paste'values }\n    paste \"B1\" { paste'mode with Op= op'add }\n    paste \"B1\" { paste'mode with SkipBlanks= true }\n    paste \"B1\" { paste'mode with Transpose= true }\n    paste \"B1\" { paste'mode with Paste= paste'values; SkipBlanks= true }\n    paste \"B1\" { paste'mode with Paste= paste'values; Transpose= true }\n    // 範囲貼り付けも可能.\n    paste \"B1:B3\" paste'mode\n\n    // クリップボードのデータを C1 に挿入.\n    insert \"C1\" insert'mode\n    insert \"C1\" { insert'mode with Shift= shift'down }\n    insert \"C1\" { insert'mode with Origin= origin'below }\n    insert \"C1\" { insert'mode with Shift= shift'right; Origin= origin'below }\n    // 範囲挿入も可能.\n    insert \"C1:C3\" insert'mode\n\n    // A1 のデータを削除する.\n    delete \"A1\" delete'mode\n    delete \"A1\" { delete'mode with Shift= shift'up }\n    // 範囲削除も可能.\n    delete \"A1:A3\" delete'mode\n\n    // A1 に値を設定.\n    set \"A1\" 100\n    set \"A1\" sheet.[\"B1\"]\n\n    // A1 に関数を設定.\n    fx \"A1\" \"SUM(A1:B3)\"\n    fx \"A1\" sheet.[\"B1\"]\n    \n    // 列幅を 100 に設定.\n    width \"A1\" 100\n    width \"A1:B3\" 100\n    // 行高を 100 に設定.\n    height \"A1\" 100\n    height \"A1:B3\" 100\n\n    // 列幅を自動調整.\n    fit'width \"A1\"\n    fit'width \"A1:B3\"\n    // 行高を自動調整.\n    fit'height \"A1\"\n    fit'height \"A1:B3\"\n\n    // 背景色を設定.\n    set \"A1\" Color.Blue\n    // 背景色をテーマカラーで設定.\n    set \"A1\" theme'accent1\n    // 背景パターンを設定.\n    set \"A1\" pattern'horizontal\n\n    // セルを結合.\n    merge \"C1:D3\" true\n    merge \"E1:F3\" false\n    // セルの結合を解除.\n    unmerge \"C1:D3\"\n    unmerge \"E1:F3\"\n\n    // 折り返して全体を表示.\n    wrap \"A1\"\n    // 折り返して全体を表示を解除.\n    unwrap \"A1\"\n\n    // 縮小して全体を表示.\n    shrink \"A1\"\n    // 縮小して全体を表示を解除.\n    unshrink \"A1\"\n\n    // 文字の方向を設定.\n    orientation \"A1\" -90\n    orientation \"A1\" 0\n    orientation \"A1\" 90\n\n    // 表示形式を設定.\n    format \"A1\" \"(日付)yyyy-MM-dd\"\n  }\n```\n\n### ◼◻ チャートやグラフを挿入する\u003cbr\u003e`chart'op (sheet: IWorksheet)` コンピュテーション式\n\n#### 📑 `chart'op` で利用できるカスタムオペレーション\n\n| operation name | description | values |\n| --- | --- | --- |\n| `select (target: string)` | チャートで利用するデータの範囲を選択する. | - |\n| `size (size: (int\u003ccols\u003e * int\u003crows\u003e))` | チャートのサイズをセル数で指定する. (幅 * 高さ). | - |\n| `position (position: string)` | チャートを挿入する位置を指定する. | - |\n| `add (recipe: ChartRecipe, ?newLayout: bool)` | チャートを追加する. | `newLayout`: 動的書式設定規則を使用する (default: true). |\n\n#### 📑 `ChartRecipe` の要素\n\n| name | description |\n| --- | --- |\n| `columnClustered` | 集合縦棒 |\n| `columnStacked` | 積み上げ縦棒 |\n| `columnStacked100` | 100% 積み上げ縦棒 |\n| `barStacked` | 積み上げ横棒 |\n| `barStacked100` | 100% 積み上げ横棒 |\n| `column3d` | 3-D 縦棒 |\n| `columnClustered3d` | 3-D 集合縦棒 |\n| `coneCol` | 3-D 円錐型縦棒 |\n| `coneColClustered` | 集合円錐型 縦棒 |\n| `cylinderCol` | 3-D 円柱型 縦棒 |\n| `cylinderColClustered` | 集合円錐型 縦棒 |\n| `pyramidCol` | 3-D ピラミッド型縦棒 |\n| `pyramidColClustered` | 集合ピラミッド型 縦棒 |\n| `columnStacked3d` | 3-D 積み上げ縦棒 |\n| `columnStacked3d100` | 3-D 100% 積み上げ縦棒 |\n| `cylinderColStacked` | 積み上げ円錐型 縦棒 |\n| `cylinderColStacked100` | 100% 積み上げ円柱型 縦棒 |\n| `cylinderBarStacked` | 積み上げ円柱型 横棒 |\n| `cylinderBarStacked100` | 100% 積み上げ円柱型 横棒 |\n| `coneColStacked` | 積み上げ円錐型 縦棒 |\n| `coneColStacked100` | 100% 積み上げ円錐型 縦棒 |\n| `coneBarStacked` | 積み上げ円錐型 横棒 |\n| `coneBarStacked100` | 100% 積み上げ円錐型 横棒 |\n| `pyramidColStacked` | 積み上げピラミッド型 縦棒 |\n| `pyramidColStacked100` | 100% 積み上げピラミッド型 縦棒 |\n| `pyramidBarStacked` | 積み上げピラミッド型 横棒 |\n| `pyramidBarStacked100` | 100% 積み上げピラミッド型 横棒 |\n| `barStacked3d` | 3-D 積み上げ横棒 |\n| `barStacked3d100` | 3-D 100% 積み上げ横棒 |\n| `barClustered` | 集合横棒 |\n| `barClustered3d` | 3-D 集合横棒 |\n| `cylinderBarClustered` | 集合円柱型 横棒 |\n| `coneBarClustered` | 集合円錐型 横棒 |\n| `pyramidBarClustered` | 集合ピラミッド型 横棒 |\n| `lineStacked` | 積み上げ折れ線 |\n| `lineStacked100` | 100% 積み上げ折れ線 |\n| `lineMarkersStacked100` | マーカー付き 100% 積み上げ折れ線 |\n| `line` | 折れ線 |\n| `lineMarkers` | マーカー付き折れ線 |\n| `lineMarkersStacked` | マーカー付き積み上げ折れ線 |\n| `pieOfPie` | 補助円グラフ付き円 |\n| `barOfPie` | 補助縦棒グラフ付き円 |\n| `doughnut` | ドーナツ |\n| `doughnutExploded` | 分割ドーナツ |\n| `pie` | 円 |\n| `pieExploded` | 分割円 |\n| `pie3d` | 3-D 円 |\n| `pieExploded3d` | 分割 3-D 円 |\n| `xyScatter` | 散布図 |\n| `xyScatterSmooth` | 平滑線付き散布図 |\n| `xyScatterSmoothNoMarkers` | 平滑線付き散布図（データ マーカーなし） |\n| `xyScatterLines` | 折れ線付き散布図 |\n| `xyScatterLinesNoMarkers` | 折れ線付き散布図（データ マーカーなし） |\n| `area` | 面 |\n| `areaStacked` | 積み上げ面 |\n| `areaStacked100` | 100% 積み上げ面 |\n| `area3d` | 3-D 面 |\n| `areaStacked3d` | 3-D 積み上げ面 |\n| `areaStacked1003d` | 3-D 100% 積み上げ面 |\n| `radar` | レーダー |\n| `radarMarkers` | データ マーカー付きレーダー |\n| `radarFilled` | 塗りつぶしレーダー |\n| `surface` | 3-D 表面 |\n| `surfaceWireframe` | 3-D 表面（ワイヤーフレーム） |\n| `surfaceTopView` | 表面（トップビュー） |\n| `surfaceTopViewWireframe` | 表面（トップビュー・ワイヤーフレーム） |\n| `line3d` | 3-D 折れ線 |\n| `bubble` | バブル |\n| `bubble3dEffect` | 3-D 効果付きバブル |\n| `stockHLC` | 高値-安値-終値 |\n| `stockOHLC` | 始値-高値-安値-終値 |\n| `stockVHLC` | 出来高-高値-安値-終値 |\n| `stockVOHLC` | 出来高-始値-高値-安値-終値 |\n| `sunburst` | サンバースト |\n\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n  \n  sheet.[\"A1:F1\"] |\u003e set [| 100; 120; 110; 100; 200; 180; |]\n\n  chart'op sheet {\n    select \"A1:F1\"\n    position \"A2\"\n    size (6\u003ccols\u003e, 10\u003crows\u003e)\n    add ChartRecipe.line\n  } |\u003e ignore\n\n```\n\n### ◼◻ IExcelRangeを削除する\u003cbr\u003e`delete (direction: DeleteShiftDirection) (target: IExcelRange): unit`\n\n#### 📑 `DeleteShiftDirection`\n\n| value | description |\n| --- | --- |\n| `shift'left` | 削除後, 左方向へシフト. |\n| `shift'up` | 削除後, 上方向へシフト. |\n\n```fsharp\n[\u003cEntryPoint\u003e]\nlet main argv =\n  use excel = open' \"C:/work/sample.xlsx\"\n  let sheet = excel |\u003e workbook(1) |\u003e worksheet(1)\n  \n  // 対象を削除.\n  sheet.[\"A1\"] |\u003e delete shift'up\n  sheet.[\"A1:A3\"] |\u003e delete shift'left\n```\n\n---\n\n## 🔷 Utility  \n\n### ◼◻ 数値をカラム名に変換する\u003cbr\u003e`column'name (index: int): string`\n\n```fsharp\nlet name = 1 |\u003e column'name     // A\nlet name = 10 |\u003e column'name    // J\nlet name = 128 |\u003e column'name   // DX\n```\n\n### ◼◻ カラム名をインデックスに変換する\u003cbr\u003e`column'number (column: string): int`\n\n```fsharp\nlet number = \"A\" |\u003e column'number     // 1\nlet number = \"J\" |\u003e column'number     // 10\nlet number = \"DX\" |\u003e column'number    // 128\n```\n\n### ◼◻ IExcelRangeからアドレスを取得する\u003cbr\u003e`address (target: IExcelRange): string`\n\n```fsharp\nlet adds = sheet.[\"A1\"] |\u003e address      // $A$1\nlet adds = sheet.[\"A1:B3\"] |\u003e address   // $A$1:$B$3\n```\n\n### ◼◻ ExcelObjectを選択する\u003cbr\u003e`activate (target: ^T): unit`\n\n```fsharp\n// Workbookを選択状態にする.\nexcel |\u003e workbook(1) |\u003e activate\n\n// Worksheetを選択状態にする.\nexcel |\u003e workbook(1) |\u003e worksheet(1) |\u003e activate\n\n// Cellを選択状態にする.\nsheet.[\"B1\"] |\u003e activate\nsheet.[\"A1:B3\"] |\u003e activate\n```\n\n### ◼◻ ExcelObjectを選択する\u003cbr\u003e`select (target: ^T): unit`\n\n```fsharp\n// Worksheet(1)を選択状態にする.\nexcel |\u003e workbook(1) |\u003e worksheet(1) |\u003e select\n\n// Cellを選択状態にする.\nsheet.[\"B1\"] |\u003e select\nsheet.[\"D1:E3\"] |\u003e select\n```\n\n---\n\n## 🔷 TIPS  \n\n### ◼◻ `try-with` の利用  \n\n例外処理を施していない場合 Excel COM オブジェクトが適切に解放されず, プロセス上に残ってしまう恐れがあります.  \n`try-with` (または `try-with-finally`) と `use` を併用することで Excel COM オブジェクトの解放漏れを防げます.  \n\n```fsharp\ntry\n  // use を利用する.\n  use excel = create ()\n\n  // do somethings\n\nwith\n  _ -\u003e ()\n```  \n\nまた, F# Interactive で利用する場合, `attach` したあとは必ず `detach` する必要があります.  \n\n```powershell\nlet ps = enumerate ();;\nlet excel = ps.[0] |\u003e attach;;\n\n# do somethings\n\nexcel |\u003e detach;;\n```\n\n### ◼◻ `LangVersion` の指定  \n\n**.NET 5** を利用している場合, うまくコンピュテーション式が動作しない可能性があります.  \nその場合は `LangVersion` に **preview** を指定するようにしてください.\n\n```xml\n\u003c!-- .fsproj を書き換える場合 --\u003e\n\u003cPropertyGroup\u003e\n  \u003cLangVersion\u003epreview\u003c/LangVersion\u003e\n\u003c/PropertyGroup\u003e\n```\n\n```powershell\n# dotnet fsi コマンドにオプションを指定する場合\ndotnet fsi --langversion:preview\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftatsuya-midorikawa%2Ffxcel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftatsuya-midorikawa%2Ffxcel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftatsuya-midorikawa%2Ffxcel/lists"}