NPOI HSSFHyperlink HyperlinkType.File 乱码(??)

本文详细解析了NPOI在导出Excel文件时中文乱码问题的原因,并提供了有效的解决方法,包括修改代码以正确处理中文路径编码。

问题现象: 在用NPOI导出Excel文件后,发现用Excel软件打开创建的文件时文件

                   链接(HyperlinkType.File)路径中的中文是乱码(??) 而URl链接路径中

                   的中文是正常的.

问题原因: 于是看了NOPI的源码,发现链接类型  HyperlinkType.File 和 HyperlinkType.Url 

                   在将路径序列化的方法是不一样的:

                   a. HyperlinkType.Url  类型用 StringUtil.PutUnicodeLE 方法以 "UTF-16LE" 编

                       码的方式写到Excel文件中

                   b. HyperlinkType.File 类型用 StringUtil.PutCompressedUnicode 方法以 

                     "ISO-8859-1" 编码的方式写到Excel文件中,"ISO-8859-1" 是不能表示中

                      文的,在将路径转成 "ISO-8859-1" 编码后,原先的内容以改变,在Excel软

                       就显示为乱码(??)

解决办法:  将原先的代码:
                   HSSFHyperlink link = new HSSFHyperlink(HyperlinkType.File);

                   string strPath = "\\目录\\文件名.jpg";

                   link.Address =  strPath 

                   改为以下代码: 
                   HSSFHyperlink link = new HSSFHyperlink(HyperlinkType.File);
                   string strPath = "\\目录\\文件名.jpg";
                   //----------------------------增加的代码------------------------------------
                   byte[] srcBytes = Encoding.Default.GetBytes(strPath );
                   string strPath = Encoding.GetEncoding("ISO-8859-1").GetString(srcBytes); 

                   //-------------------------------------------------------------------------------
                   link.Address =  strPath 

### NPOI.SS.Formula.Functions `NPOI.SS.Formula.Functions` 命名空间包含了许多用于处理 Excel 公式函数的类。可以使用这些类来实现自定义的公式计算。 ```csharp using NPOI.SS.Formula.Eval; using NPOI.SS.Formula.Functions; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.IO; class Program { static void Main() { // 创建一个新的工作簿 IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建一行和一个单元格 IRow row = sheet.CreateRow(0); ICell cell = row.CreateCell(0); // 设置单元格的值 cell.SetCellValue(10); // 使用内置函数进行计算 Function function = Sum.instance; ValueEval[] args = { new NumberEval(10), new NumberEval(20) }; ValueEval result = function.Evaluate(0, 0, args); if (result is NumberEval) { double value = ((NumberEval)result).NumberValue; Console.WriteLine($"计算结果: {value}"); } // 保存工作簿 using (FileStream file = new FileStream("output.xlsx", FileMode.Create, FileAccess.Write)) { workbook.Write(file); } } } ``` ### NPOI.SS.UserModel `NPOI.SS.UserModel` 是 NPOI 的核心命名空间,提供了操作 Excel 工作表、行、单元格等的基本接口。 ```csharp using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.IO; class Program { static void Main() { // 创建一个新的工作簿 IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建一行 IRow row = sheet.CreateRow(0); // 创建一个单元格并设置值 ICell cell = row.CreateCell(0); cell.SetCellValue("Hello, NPOI!"); // 保存工作簿 using (FileStream file = new FileStream("output.xlsx", FileMode.Create, FileAccess.Write)) { workbook.Write(file); } } } ``` ### NPOI.XSSF.UserModel `NPOI.XSSF.UserModel` 用于处理 `.xlsx` 格式的 Excel 文件。 ```csharp using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.IO; class Program { static void Main() { // 打开一个现有的 .xlsx 文件 using (FileStream file = new FileStream("input.xlsx", FileMode.Open, FileAccess.Read)) { IWorkbook workbook = new XSSFWorkbook(file); ISheet sheet = workbook.GetSheetAt(0); // 获取第一行 IRow row = sheet.GetRow(0); // 获取第一个单元格的值 ICell cell = row.GetCell(0); string value = cell.StringCellValue; Console.WriteLine($"单元格的值: {value}"); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值