使用 excel intro 或 npoi 从 excel(具有行和单元格位置)读取图像
Reading images from excel (with row and cell position) using excel introp or npoi
我需要从 excel 开始和结束行号提取图像。并开始 && 结束 col no
我目前的代码如下:-
var excelApp = new Application();
var wb = excelApp.Workbooks.Open(filePath, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
var ws = (Worksheet)wb.Worksheets["Sheet1"];
int startCol = 0;
int startRow =0;
int endCol = 0;
int endRow = 0;
foreach (var pic in ws.Pictures())
{
int startCol = pic.TopLeftCell.Column;
int startRow = pic.TopLeftCell.Row;
int endCol = pic.BottomRightCell.Column;
int endRow = pic.BottomRightCell.Row;
}
当所有图像都不同时,上面的代码工作正常,但是当我将相同的图像放在不同的单元格中时,它只选择第一个。
例如,
当我 put abc.jpeg at B1 cell and xyz.jpeg at C5 cell
然后 results are
时工作正常
two object first startRow=1,endRow=1,startCol=1,endCol=1 and
second startRow=5,endRow=5,startCol=2,endCol=2
但是如果我 put abc.jpeg at B1 cell and C5 cell
然后 result is one object
和 startRow=1,endRow=1,startCol=1,endCol=1
两个 images.It 都不会拍摄第二张图片。
为什么会这样?有没有使用interop或npoi的解决方案
TL;DR - NPOI 的行为与 Excel Interop 相同,当同一图像被添加两次时返回一张图像。它可能出于同样的原因这样做。 EPPlus(此 post 中的最后一个测试)以您期望的方式处理这种情况,分别识别图片的两个实例并返回它们在工作中的位置 sheet.
我首先尝试使用 NPOI。我创建了一个工作簿并将相同的图片插入到两个位置的第一个 sheet。
-----
| |
-----
-----
| |
-----
使用NPOI
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NPOI.XSSF.UserModel;
using System.IO;
namespace ExcelImageTests
{
[TestClass]
public class NpoiExcelImages
{
[TestMethod]
public void FindsTwoDistinctImagesInFile()
{
XSSFWorkbook workbook;
using (var file = new FileStream(@"C:\Users\path-to-my-file\sotest.xlsx",
FileMode.Open, FileAccess.Read))
{
workbook = new XSSFWorkbook(file);
}
var pictures = workbook.GetAllPictures();
Assert.AreEqual(2, pictures.Count);
}
}
}
这是我对 NPOI 的了解。测试失败。 NPOI 计算一张图片,而不是两张。
奇怪的是,它也没有参考 sheet 级别的形状、图片或绘图。返回的图片是 XSSFPictureData
类型,包含图片的二进制数据。不是指作品sheet与图片的关系。我怀疑这就是为什么它只返回一个。一张图片嵌入了两次。
为了确认,我添加了另一张与前两张不同的图片。现在测试通过了。 sheet 上可见三张图片,但 GetAllPictures()
.
返回两张不同的图片
您提到了 Interop 和 NPOI,但另一个选择是 EPPlus。它更常用,使用 NPOI 几分钟后我明白了原因。 NPOI returns 很多 object
类型,就像 Excel Interop,你必须知道它们是什么,这样你才能将它们转换为那些类型。
EPPlus 好多了。这是与 EPPlus:
相同的测试
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml;
using System.IO;
namespace ExcelImageTests
{
[TestClass]
public class EPPlusExcelImages
{
[TestMethod]
public void FindsTwoDistinctImagesInFile()
{
var file = new FileInfo(@"C:\Users\path-to-my-file\sotest.xlsx");
using (var package = new ExcelPackage(file))
{
var workbook = package.Workbook;
var sheet = workbook.Worksheets[1];
Assert.AreEqual(2, sheet.Drawings.Count)
var drawingOne = sheet.Drawings[0];
var drawingTwo = sheet.Drawings[1];
// From returns the position of the upper left corner of the picture.
// To returns the position of the lower right corner.
Assert.IsTrue(drawingOne.From.Row < drawingTwo.From.Row);
Assert.IsTrue(drawingOne.From.Column < drawingTwo.From.Column);
Assert.IsTrue(drawingOne.To.Row < drawingTwo.To.Row);
Assert.IsTrue(drawingOne.To.Column < drawingTwo.To.Column);
}
}
}
}
本次测试通过。它检测到两个图像,并正确地告诉我它们的相对位置。你没有我的作品sheet,但我检查了一下,行和列都是正确的。
一个奇怪的细节是 worksheet 索引是从 1 开始的,但行和列是从 0 开始的。但这没什么大不了的。
此外,虽然从包中返回的所有对象都是 IDisposable
,但大多数示例仅显示处理包本身。一位用户注意到其他对象的 Dispose
方法是空的。那真是怪了。但它仍然比 Excel Interop 要好,你必须在其中释放 COM 对象。
我需要从 excel 开始和结束行号提取图像。并开始 && 结束 col no
我目前的代码如下:-
var excelApp = new Application();
var wb = excelApp.Workbooks.Open(filePath, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
var ws = (Worksheet)wb.Worksheets["Sheet1"];
int startCol = 0;
int startRow =0;
int endCol = 0;
int endRow = 0;
foreach (var pic in ws.Pictures())
{
int startCol = pic.TopLeftCell.Column;
int startRow = pic.TopLeftCell.Row;
int endCol = pic.BottomRightCell.Column;
int endRow = pic.BottomRightCell.Row;
}
当所有图像都不同时,上面的代码工作正常,但是当我将相同的图像放在不同的单元格中时,它只选择第一个。
例如,
当我 put abc.jpeg at B1 cell and xyz.jpeg at C5 cell
然后 results are
时工作正常
two object first startRow=1,endRow=1,startCol=1,endCol=1 and
second startRow=5,endRow=5,startCol=2,endCol=2
但是如果我 put abc.jpeg at B1 cell and C5 cell
然后 result is one object
和 startRow=1,endRow=1,startCol=1,endCol=1
两个 images.It 都不会拍摄第二张图片。
为什么会这样?有没有使用interop或npoi的解决方案
TL;DR - NPOI 的行为与 Excel Interop 相同,当同一图像被添加两次时返回一张图像。它可能出于同样的原因这样做。 EPPlus(此 post 中的最后一个测试)以您期望的方式处理这种情况,分别识别图片的两个实例并返回它们在工作中的位置 sheet.
我首先尝试使用 NPOI。我创建了一个工作簿并将相同的图片插入到两个位置的第一个 sheet。
-----
| |
-----
-----
| |
-----
使用NPOI
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NPOI.XSSF.UserModel;
using System.IO;
namespace ExcelImageTests
{
[TestClass]
public class NpoiExcelImages
{
[TestMethod]
public void FindsTwoDistinctImagesInFile()
{
XSSFWorkbook workbook;
using (var file = new FileStream(@"C:\Users\path-to-my-file\sotest.xlsx",
FileMode.Open, FileAccess.Read))
{
workbook = new XSSFWorkbook(file);
}
var pictures = workbook.GetAllPictures();
Assert.AreEqual(2, pictures.Count);
}
}
}
这是我对 NPOI 的了解。测试失败。 NPOI 计算一张图片,而不是两张。
奇怪的是,它也没有参考 sheet 级别的形状、图片或绘图。返回的图片是 XSSFPictureData
类型,包含图片的二进制数据。不是指作品sheet与图片的关系。我怀疑这就是为什么它只返回一个。一张图片嵌入了两次。
为了确认,我添加了另一张与前两张不同的图片。现在测试通过了。 sheet 上可见三张图片,但 GetAllPictures()
.
您提到了 Interop 和 NPOI,但另一个选择是 EPPlus。它更常用,使用 NPOI 几分钟后我明白了原因。 NPOI returns 很多 object
类型,就像 Excel Interop,你必须知道它们是什么,这样你才能将它们转换为那些类型。
EPPlus 好多了。这是与 EPPlus:
相同的测试using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml;
using System.IO;
namespace ExcelImageTests
{
[TestClass]
public class EPPlusExcelImages
{
[TestMethod]
public void FindsTwoDistinctImagesInFile()
{
var file = new FileInfo(@"C:\Users\path-to-my-file\sotest.xlsx");
using (var package = new ExcelPackage(file))
{
var workbook = package.Workbook;
var sheet = workbook.Worksheets[1];
Assert.AreEqual(2, sheet.Drawings.Count)
var drawingOne = sheet.Drawings[0];
var drawingTwo = sheet.Drawings[1];
// From returns the position of the upper left corner of the picture.
// To returns the position of the lower right corner.
Assert.IsTrue(drawingOne.From.Row < drawingTwo.From.Row);
Assert.IsTrue(drawingOne.From.Column < drawingTwo.From.Column);
Assert.IsTrue(drawingOne.To.Row < drawingTwo.To.Row);
Assert.IsTrue(drawingOne.To.Column < drawingTwo.To.Column);
}
}
}
}
本次测试通过。它检测到两个图像,并正确地告诉我它们的相对位置。你没有我的作品sheet,但我检查了一下,行和列都是正确的。
一个奇怪的细节是 worksheet 索引是从 1 开始的,但行和列是从 0 开始的。但这没什么大不了的。
此外,虽然从包中返回的所有对象都是 IDisposable
,但大多数示例仅显示处理包本身。一位用户注意到其他对象的 Dispose
方法是空的。那真是怪了。但它仍然比 Excel Interop 要好,你必须在其中释放 COM 对象。