我想要用C#利用NPOI往Excel插入视频文件,研究了半年(天资愚钝的我),终于一晚搞定了,不过有些问题还没解决。我直接上代码吧。
可以看到封面图,里面就是视频文件了
双击打开,能弹出对话框
能正常打开了
注意:如果视频有点大,可能第一次打开视频关闭后会卡顿(原因未知,如果有大佬知道希望能解释下),然后封面丢失(这个对我来说无所谓),图标会缩小。
拉大图标后可以看到样子了
//引用自行百度
class Program
{
static void Main(string[] args)
{
//视频路径
string VideoPath = @"C:\Users\Lenovo\Desktop\测试\111.mp4";
//图片路径(封面)
string picturePath = @"C:\Users\Lenovo\Desktop\测试\background_car.jpg";
//文件名称
string fileName = "111.mp4";
//将视频文件和图片文件转化为字节数组
byte[] videoByte = ToByte(VideoPath);
byte[] pictureByte = ToByte(picturePath);
//创建工作薄对象
HSSFWorkbook workbook = new HSSFWorkbook();
//创建sheet
ISheet sheet = workbook.CreateSheet("测试");
//获取第一个sheet的对象
HSSFSheet sheet01 = (HSSFSheet)workbook.GetSheet(workbook.GetSheetName(0));
//创建行,单元格
IRow row = sheet.CreateRow(50);
ICell cell = row.CreateCell(50);
//给表格添加ole对象(视频)
//AddOlePackage这个API里面的参数没具体介绍,我自己简单介绍下
//第一个参数,byte[]:有效载荷,就是文件转化为字节数组后的数组
//第二个参数,string label:标签 ,字符串,这个感觉没啥影响,我瞎填写的。但不能为null
//第三个参数,string path:视频路径
//第四个参数,string command:有效载荷的名,就是打开视频后显示的文件名
int video_count = workbook.AddOlePackage(videoByte, "mp4", VideoPath,fileName);
//给表格添加图片对象,第二个参数是图片格式,返回的int是在表格里第几个图片,第一个图片为1
int picture_count = workbook.AddPicture(pictureByte, PictureType.JPEG);
//Console.WriteLine(picture_count);//输出1
// Console.WriteLine(video_count);//输出1
//将ole对象在画布中显示出来。
//原因:上面的几行代码只是将文件流放入在EXCEL中,却完全不显示在哪。
//文件大小的确变大了,却看不到视频在哪,所以需要画布显示出来
AddOLE(video_count, sheet01,picture_count);
Console.WriteLine("视频添加成功");
Console.ReadKey();
//保存excel路径
string SavePath = @"C:\Users\Lenovo\Desktop\测试\汇总文件.xlsx";
//保存文件
FileStream fs = new FileStream(SavePath, FileMode.Create);
//将内存中的内容写入文件中。
workbook.Write(fs);
}
/// <summary>
/// 将文件转化为二进制流
/// </summary>
/// <param name="VideoPath"></param>
/// <returns></returns>
public static byte[] ToByte(string VideoPath)
{
//创建filestream对象,路径,打开方式,只读
FileStream fs = new FileStream(VideoPath, FileMode.Open, FileAccess.Read);
try
{
//数组长度为文件流的长度
byte[] by = new byte[fs.Length];
//写入到字节数组中
fs.Read(by, 0, (int)fs.Length);
return by;
}
catch (Exception ex)
{
return null;
}
finally
{
if (fs != null)
{ fs.Close(); }
}
}
//画布详细讲解:https://blog.csdn.net/u013986317/article/details/102502794
/// <summary>
/// 创建画布并正式插入ole对象
/// </summary>
/// <param name="count">表格中ole对象的序号,就是第几个视频</param>
/// <param name="sheet">要插入对象的所在sheet</param>
/// <param name="index">表格中图片(封面)的序号</param>
public static void AddOLE(int count,HSSFSheet sheet,int index)
{
//创建画布
HSSFPatriarch canvas = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
//设置图片坐标与大小
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, 4, 4, 8, 8);
//正式插入图片
//HSSFPicture pict = (HSSFPicture)canvas.CreatePicture(anchor, count);
HSSFObjectData video = (HSSFObjectData)canvas.CreateObjectData(anchor, count,1);
}
}