Unity中利用NOPI读取Excel

—0v0— 前言

	最近工作遇到解析.xls的需求,大致经过了以下几个阶段:
	1、使用windows系统自带的Excel.dll解析,以前用这个解析.xlsx文件没问题,但是不能解析.xls;
	2、用EPPlus.dll解析,结果能读取简单的几行几列数据,受限太大;
	3、最终NPOI解决了这个问题(期间遇到两个问题:a、.dll找不到 b、网上直接下的.dll不全,各种报错)
	4、在这里感谢NPOI作者!
	5、引用
		1)https://www.cnblogs.com/yhood/p/11525922.html C#获取文件的后缀,文件名和路径
		2)https://www.cnblogs.com/zqyw/p/7462030.html NPOI操作Excel(一)--NPOI基础

—0_0— NPOI的相关.dll网盘下载链接

	链接:https://pan.baidu.com/s/1TWf-dzeLsZRvSP_Bz8w4Rg  提取码:yz4t
	注:.NET 3.5用dotnet2里面的.dll,.NET 4.0用dotnet4里面的.dll,Unity里建Plugins文件夹,将.dll拷贝过去

	原始下载链接:https://archive.codeplex.com/?p=npoi (下载后把里面\releases\0\目录下的文件用7z解压或者加上.zip的后缀直接解压【我是将其改名成NPOI.7z】,这里感谢https://blog.csdn.net/wf824284257/article/details/77113691里评论的luoyvtianxiang)

在这里插入图片描述

一、解析Excel的类

/*
 * Edit by XJH at 2020-05-12
 */
using System.Collections.Generic;
using UnityEngine;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
using NPOI.XSSF.UserModel;

/// <summary>
/// HSSFWorkbook 用于  .xls
/// XSSFWorkbook 用于  .xlsx
/// </summary>
public class NPOI2Excel{
	/// <summary>
	/// 加载Excel文件
	/// </summary>
	/// <param name="excelPath">文件路径</param>
	/// <returns></returns>
	public static IWorkbook LoadExcel(string excelPath)
	{
		string suffixStr = Path.GetExtension(excelPath);
		switch (suffixStr)
		{
			case ".xls":
				return ReadXLS(excelPath);
			case ".xlsx":
				return ReadXLSX(excelPath);
			default:
				break;
		}
		Debug.LogError("File isn't .xls or .xlsx");
		return null;
	}
	/// <summary>
	/// 加载Excel文件
	/// 获取某行某列的值
	/// </summary>
	/// <param name="excelPath">文件路径</param>
	/// <param name="sheetIndex">单元下标</param>
	/// <param name="rowNum">行下标</param>
	/// <param name="cellNum">列下标</param>
	/// <returns>单元格字符串</returns>
	public static string LoadExcel(string excelPath,int sheetIndex,int rowNum,int cellNum)
	{
		return LoadExcel(excelPath).GetSheetAt(sheetIndex).GetRow(rowNum).GetCell(cellNum).ToString();
	}
	/// <summary>
	/// 加载Excel文件
	/// 获取某行某列的值
	/// </summary>
	/// <param name="excelPath">文件路径</param>
	/// <param name="sheetName">单元名称</param>
	/// <param name="rowNum">行下标</param>
	/// <param name="cellNum">列下标</param>
	/// <returns>单元格字符串</returns>
	public static string LoadExcel(string excelPath, string sheetName, int rowNum, int cellNum)
	{
		return LoadExcel(excelPath).GetSheet(sheetName).GetRow(rowNum).GetCell(cellNum).ToString();
	}
	/// <summary>
	/// 加载Excel文件
	/// 所有数据
	/// </summary>
	/// <param name="excelPath">文件路径</param>
	/// <param name="sheetIndex">单元下标</param>
	/// <returns>数据</returns>
	public static List<string>[] LoadExcel(string excelPath, int sheetIndex)
	{
		ISheet sheet = LoadExcel(excelPath).GetSheetAt(sheetIndex);
		List<string>[] fullData = new List<string>[sheet.LastRowNum - sheet.FirstRowNum];
		for (int i = sheet.FirstRowNum; i < sheet.LastRowNum; i++)
		{
			List<string> rowData = new List<string>();
			for (int k = sheet.GetRow(i).FirstCellNum; k < sheet.GetRow(i).LastCellNum; k++)
			{
				//直接GetCell(k).StringCellValue会报错:
				//InvalidOperationException: Cannot get a text value from a numeric cell
				//因为Cell可能为其他类型,
				//**************************************
				//方法一:将类型转换为string
				//if (sheet.GetRow(i).GetCell(k) != null)
				//{
				//	sheet.GetRow(i).GetCell(k).SetCellType(CellType.String);
				//}
				//方法二:直接ToString()
				rowData.Add(sheet.GetRow(i).GetCell(k).ToString());
			}
			fullData[i] = rowData;
		}
		return fullData;
	}
	/// <summary>
	/// 加载Excel文件
	/// 所有数据
	/// </summary>
	/// <param name="excelPath">文件路径</param>
	/// <param name="sheetName">单元名称</param>
	/// <returns>数据</returns>
	public static List<string>[] LoadExcel(string excelPath, string sheetName)
	{
		ISheet sheet = LoadExcel(excelPath).GetSheet(sheetName);
		List<string>[] fullData = new List<string>[sheet.LastRowNum - sheet.FirstRowNum];
		for (int i = sheet.FirstRowNum; i < sheet.LastRowNum; i++)
		{
			List<string> rowData = new List<string>();
			for (int k = sheet.GetRow(i).FirstCellNum; k < sheet.GetRow(i).LastCellNum; k++)
			{
				//直接GetCell(k).StringCellValue会报错:
				//InvalidOperationException: Cannot get a text value from a numeric cell
				//因为Cell可能为其他类型,
				//**************************************
				//方法一:将类型转换为string
				//if (sheet.GetRow(i).GetCell(k) != null)
				//{
				//	sheet.GetRow(i).GetCell(k).SetCellType(CellType.String);
				//}
				//方法二:直接ToString()
				rowData.Add(sheet.GetRow(i).GetCell(k).ToString());
			}
			fullData[i] = rowData;
		}
		return fullData;
	}

	/// <summary>
	/// 读取Excel文件(.xls)
	/// </summary>
	public static HSSFWorkbook ReadXLS(string excelPath)
	{
		//后缀判断
		if (!Path.GetExtension(@excelPath).Contains(".xls"))
		{
			Debug.LogError("This is not a .xls File");
			return null;
		}
		FileStream fs = File.OpenRead(@excelPath);
		HSSFWorkbook xlsData = new HSSFWorkbook(fs);
		fs.Close();
		fs.Dispose();
		return xlsData;
	}
	/// <summary>
	/// 读取Excel文件(.xlsx)
	/// </summary>
	public static XSSFWorkbook ReadXLSX(string excelPath)
	{
		//后缀判断
		if (!Path.GetExtension(@excelPath).Contains(".xlsx"))
		{
			Debug.LogError("This is not a .xlsx File");
			return null;
		}
		FileStream fs = File.OpenRead(@excelPath);
		XSSFWorkbook xlsxData = new XSSFWorkbook(fs);
		fs.Close();
		fs.Dispose();
		return xlsxData;
	}
}

二、测试代码

挂在Unity场景中,Inspector上赋值excelPath,运行即可
/*
 * Edit by XJH at 2020-05-12
 */
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 读取Excel文件测试代码
/// </summary>
public class TestExcel : MonoBehaviour {

	[Header("Excel文件路径(带后缀)")]
	public string excelPath;
	// Use this for initialization
	void Start () {
		List<string>[] excelData = NPOI2Excel.LoadExcel(excelPath, 0);
		for (int i = 0; i < excelData.Length; i++)
		{
			for (int k = 0; k < excelData[i].Count; k++)
			{
				Debug.Log(string.Format("第{0}行 第{1}列>{2}", i + 1, k + 1, excelData[i][k]));
			}
		}
	}
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值