在 alpine 中使用 NPOI

来源:https://www.cnblogs.com/weihanli/archive/2019/08/02/use-npoi-in-docker-alpine.html
-Advertisement-
Play Games

在 alpine 中使用 NPOI Intro 在 .net 中常使用 NPOI 來做 Excel 的導入導出,NPOI 從 2.4.0 版本開始支持 .netstandard2.0,對於.net core 應用也可以使用 DotNetCore.NPOI。 對於 .NET Core 應用來說,如果沒 ...


在 alpine 中使用 NPOI

Intro

在 .net 中常使用 NPOI 來做 Excel 的導入導出,NPOI 從 2.4.0 版本開始支持 .netstandard2.0,對於.net core 應用也可以使用 DotNetCore.NPOI。

對於 .NET Core 應用來說,如果沒有特殊的需求,alpine 是最適合容器化的基礎 docker 鏡像,因為鏡像大小比較小,無論是對於打包還是下載都很快。

在我的一個 asp.net core 應用中有一個使用 NPOI 導出 Excel 的功能,我的應用的通過 docker 部署在 k8s 上的,而 docker 鏡像是基於 alpine 的,使用到了 NPOI 導出一個 excel

NPOI 的跨平臺實現依賴於 System.Drawing.CommonSystem.Drawing.Common 在 Linux 上的實現依賴 libgdiplus,需要安裝 libgdiplus 才能正常工作,如果沒有 libgdiplus 會遇到類似下麵這樣的異常:

在 Linux 上使用 System.Drawing.Common

sudo apt-get install libgdiplus libc6-dev
  • 在 alpine 上安裝 libgdiplus

.netcore 打包 docker 鏡像的時候我一般選擇 alpine 為基本的鏡像,因為鏡像本身比較小,下載打包都會很快很方便,於是就要找一下是不是可以在 alpine 上安裝 libgdiplus,如果不行的話就只好換鏡像了

在 alpine 的 packages 網站上找到了 libgdiplus, https://pkgs.alpinelinux.org/packages?name=libgdiplus&branch=edge

目前仍處於測試階段,還未正式發佈,不過已經可以使用,可以通過下麵的命令來在 alpine 上安裝

apk add libgdiplus --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted

More

安裝了 libgdiplus 之後,重新部署再導出測試一下,發現還是不行,現在爆的異常如下:

根據異常提示找到異常的源碼 https://github.com/tonyqus/npoi/blob/master/main/SS/Util/SheetUtil.cs#L445

看異常提示以及代碼應該是沒有字體導致的異常,然後就在安裝 libgdiplus 之後再安裝一下字體,隨便找了一個字體安裝了,安裝的是 terminus-font,裝了字體之後再測試,就可以正常導出了~

使用的 Dockerfile ,完整 Dockerfile 見:https://github.com/WeihanLi/ActivityReservation/blob/dev/Dockerfile

FROM microsoft/dotnet:2.2-aspnetcore-runtime-alpine
RUN apk add libgdiplus --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted && \
    apk add terminus-font
# ...

Reference


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、需求背景 創建線程需要時間。如果有不同的小任務完成,就可以事先創建許多線程,在應完成這些任務時發出請求。這個線程數最好在需要更多的線程時增加,在需要釋放資源時減少。 2、線程池出場 不需要自己創建這樣一個列表。該列表由ThreadPool類托管。這個類會在需要時增減池中線程的線程數,直到最大的線 ...
  • code-Behind技術就是代碼隱藏(代碼後置),在ASP.NET中通過ASPX頁面指向CS文件的方法實現顯示邏輯和處理邏輯的分離,這樣有助於web應用程式的創建。 比如分工,美工和編程的可以個乾各的,不用再像以前asp那樣都代碼和html代碼混在一起,難以維護。 code-Behind是基於部分 ...
  • VSTO簡介 VSTO(Visual Studio Tools for Office )是VBA的替代,使得開發Office應用程式更加簡單,並且用VSTO來開發office應用程式可以使用Visual studio開發環境中的眾多功能和CLR提供的記憶體管理,垃圾回收等功能 額。。。這個是百度的介紹 ...
  • C 通過反射調用 Func 委托 Intro 最近我的 NPOI 擴展庫增加了,自定義輸出的功能,可以自定義一個 Func 委托來設置要導出的內容,詳細介紹請查看 ,通過 Func 可以很方便設置,但是要調用的時候就有點麻煩了 反射調用 獲取委托的方法: 獲取要執行方法時的target: 委托的方法 ...
  • 1.先打開你需要替換的word文檔,在想要後續更換欄位值的地方添加“書簽”。 2.將模板文檔存放在 程式的Debug文件下。 3.生成文件的按鈕點擊事件 代碼: 註:需要引用 Aspose.Words.dll ...
  • TestModel類定義: public class TestModel{ public int Id { get; set; } public string Name { get; set; } public string Code { get; set; } } Dictionary與List定 ...
  • 第一次寫博客,作為一個全棧er,記錄一下從阿裡雲到產品運維上線的全過程 一、阿裡雲上的設置 購買阿裡雲ECS後: 進控制台查看實例公網IP 在控制台、網路與安全-》安全組,配置規則 點擊進去可以看到 系統預設創建了3個規則,icmp用來ping的,22是linux伺服器ssh遠程埠,3389是wi ...
  • C# async 和 await 理解 先假設如下場景: 主函數 Main,迴圈等待用戶輸入; 計算函數 Cal,耗時計算大量數據; 為了在Main函數中調用Cal函數,同時Cal函數不阻塞主函數的迴圈,此時需要考慮增加一個CalAsync函數使Cal函數非同步執行。 傳統的思維方法 在CalAsyn ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...