- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Epplus library在 Asp.Net C# 中生成 Excel 2010 及更高版本兼容的文件。我使用的是目前最新的版本 3.1.2。
在添加任何图片之前,我首先设置行高:
ExcelPackage pck = new ExcelPackage();
var ws = pck.Workbook.Worksheets.Add("sheet 1");
while (i < dt.Rows.Count + offset)
{
ws.Row(i).Height = 84;
i++;
}
dt
是我的带有 DataRows 的 DataTable。设置高度后,我再次循环遍历行以添加图片
while (i < dt.Rows.Count + offset)
{
var prodImg = ws.Drawings.AddPicture(dr["code"].ToString(), new FileInfo(path));
prodImg.SetPosition(i - 1, 0, 14, 0);
prodImg.SetSize(75);
}
这可行,但不行:
var prodImg = ws.Drawings.AddPicture(dr["code"].ToString(), new FileInfo(path));
int w = prodImg.Image.Width;
int h = prodImg.Image.Height;
if (h > 140) // because height of 84 is 140 pixels in excel
{
double scale = h / 140.0;
w = (int)Math.Floor(w / scale);
h = 140;
}
int xOff = (150 - w) / 2;
int yOff = (140 - h) / 2;
prodImg.SetPosition(i - 1, xOff, 11, yOff);
prodImg.SetSize(w, h);
这会导致图片偏离中心且图像大小未调整。然后这段代码位于同一个循环中:
var prodImgDm = ws.Drawings.AddPicture("bcdm" + dr["code"].ToString(), new FileInfo(pathDm));
prodImgDm.SetPosition(i - 1, 25, 15, 40);
prodImgDm.SetSize(100);
这有时确实有效。图片 prodImgDm
是具有静态宽度和高度的数据矩阵图像,不需要调整大小,因为它们总是很小/很小。因此,在某些行中如果没有 SetSize
,它也可以工作,而在其他一些行中,它就不起作用。真的很奇怪,因为代码是相同的。它可能是图书馆和/或 Excel 中的东西。也许我使用方法不对?有epplus图片专家吗?
提前致谢!!
编辑有时一张图片胜过一千个文字,所以这里是屏幕截图。正如您所看到的,产品图像在单元格中未水平和垂直对齐。即使我设置了 SetSize(100)
,最右侧的数据矩阵有时也会缩放约 120%,所以这对我来说真的很奇怪。所以最后一个数据矩阵具有正确的大小...我已经找到 this SO thread但我认为这对我没有帮助。
编辑 2013/04/09 Essenpillai 给了我设置的提示
pck.DoAdjustDrawings = false;
但这给了我更奇怪的图像:
数据矩阵仍在按行变化。一行没问题,另一行不行。并且 ean13 代码太宽。
最佳答案
public static void CreatePicture(ExcelWorksheet worksheet, string name, Image image, int firstColumn, int lastColumn, int firstRow, int lastRow, int defaultOffsetPixels)
{
int columnWidth = GetWidthInPixels(worksheet.Cells[firstRow, firstColumn]);
int rowHeight = GetHeightInPixels(worksheet.Cells[firstRow, firstColumn]);
int totalColumnWidth = columnWidth * (lastColumn - firstColumn + 1);
int totalRowHeight = rowHeight * (lastRow - firstRow + 1);
double cellAspectRatio = Convert.ToDouble(totalColumnWidth) / Convert.ToDouble(totalRowHeight);
int imageWidth = image.Width;
int imageHeight = image.Height;
double imageAspectRatio = Convert.ToDouble(imageWidth) / Convert.ToDouble(imageHeight);
int pixelWidth;
int pixelHeight;
if (imageAspectRatio > cellAspectRatio)
{
pixelWidth = totalColumnWidth - defaultOffsetPixels * 2;
pixelHeight = pixelWidth * imageHeight / imageWidth;
}
else
{
pixelHeight = totalRowHeight - defaultOffsetPixels * 2;
pixelWidth = pixelHeight * imageWidth / imageHeight;
}
int rowOffsetPixels = (totalRowHeight - pixelHeight) / 2;
int columnOffsetPixels = (totalColumnWidth - pixelWidth) / 2;
int rowOffsetCount = 0;
int columnOffsetCount = 0;
if (rowOffsetPixels > rowHeight)
{
rowOffsetCount = (int)Math.Floor(Convert.ToDouble(rowOffsetPixels) / Convert.ToDouble(rowHeight));
rowOffsetPixels -= rowHeight * rowOffsetCount;
}
if (columnOffsetPixels > columnWidth)
{
columnOffsetCount = (int)Math.Floor(Convert.ToDouble(columnOffsetPixels) / Convert.ToDouble(columnWidth));
columnOffsetPixels -= columnWidth * columnOffsetCount;
}
int row = firstRow + rowOffsetCount - 1;
int column = firstColumn + columnOffsetCount - 1;
ExcelPicture pic = worksheet.Drawings.AddPicture(name, image);
pic.SetPosition(row, rowOffsetPixels, column, columnOffsetPixels);
pic.SetSize(pixelWidth, pixelHeight);
}
public static int GetHeightInPixels(ExcelRange cell)
{
using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
float dpiY = graphics.DpiY;
return (int)(cell.Worksheet.Row(cell.Start.Row).Height * (1 / 72.0) * dpiY);
}
}
public static float MeasureString(string s, Font font)
{
using (var g = Graphics.FromHwnd(IntPtr.Zero))
{
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
return g.MeasureString(s, font, int.MaxValue, StringFormat.GenericTypographic).Width;
}
}
public static int GetWidthInPixels(ExcelRange cell)
{
double columnWidth = cell.Worksheet.Column(cell.Start.Column).Width;
Font font = new Font(cell.Style.Font.Name, cell.Style.Font.Size, FontStyle.Regular);
double pxBaseline = Math.Round(MeasureString("1234567890", font) / 10);
return (int)(columnWidth * pxBaseline);
}
关于excel - Epplus SetPosition图片问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15634709/
两种方法实现: public void setPosiotion(int x, int y) { //do nothing } public void setPosiotion(Point point
任务:从 mpeg2 视频文件中抓取任意帧。 现在我使用自定义渲染过滤器进行抓取,但在所需帧上定位视频时出现问题。 我使用 SetPosition(),在 Pause() 通过图形传递帧之后,等待过滤
这里是一个代码:http://jsfiddle.net/QQaZp/1/ var setPosition = function() { $('div').css('top', ($(wind
我尝试了以下代码,但是当我第二次单击 mMan1 将其从 520 移动到 422(x 中)时,它什么也没做(当我第一次单击时,setPosition 工作正常)。 \\ in onCreate
我有一个自定义CALayer,我使用CAAnimationGroup对其进行动画处理,以遵循路径并以与路径相切的方式旋转: // Create the animation path CAKeyf
我在图标中使用 svg 符号,问题是当我使用 setPosition 时, map 上的图标或标记在标题更改时不会旋转。但是如果我更改为 setMap(map) ,它将更改标题,问题是图标或标记会再次
我在使用 KineticJS 时遇到了一些麻烦。 从我的fiddle可以看出,我能够在我的放置事件中访问 Shape 对象(框),以获得 x,y 坐标,并且我正在对它们执行数学运算以获得我想要将形状“
我有一个将对象放入屏幕的循环。但出于某种原因,一些对象虽然在 printf 中打印了正确的坐标,但在 (0,0) 点,就好像他没有完成设置它的位置一样。 for (int i =0 ; i getPh
我在顶部的图层中有一个拇指 slider 和一个 Slick slider ,通过带有 display:none 的 css 隐藏。在点击事件上我调用了 setPosition 但它不起作用(
我在顶部的图层中有一个拇指 slider 和一个 Slick slider ,通过带有 display:none 的 css 隐藏。在点击事件上我调用了 setPosition 但它不起作用(
我正在创建要导出到 Excel 的图表。我需要创建多个,因此我将使用带有 4 个参数的 SetPosition() 方法来抵消它们: SetPosition(int row, int rowoffse
所以我在玩弄 KineticJS,我在制作一个按钮时遇到了一些问题。我想让它做的就是在我单击它时重置我的对象的位置。 我已经创建了按钮,设置了 onclick 处理程序以指向我创建的函数(并包含在 H
在我正在开发的一个应用程序中,根据车辆的最后已知速度,我每 100 毫秒插值一次车辆的下一个位置,并将其绘制在 map 上。这会导致移动设备出现性能问题。 我们还使用 MarkerWithLabels
我很高兴改进我的 C++ 程序,我通过 directshow 阅读视频。现在我也试着写视频,效果也很好。 然后是寻找合适的编解码器(考虑了 vob/ogg)... 但是,今天突然间视频显示的很慢。 现
问题的简单版本: 如何使用 setPositions 字段创建 EKRecurrenceRule 对象? 较长版本的问题: 我在我的应用程序中使用以下代码创建了一个带有 EKRecurrenceRul
本文整理了Java中com.facebook.yoga.YogaNode.setPosition()方法的一些代码示例,展示了YogaNode.setPosition()的具体用法。这些代码示例主要来
在 v4 中,如果您使用 AKPlayer带循环和使用 setPosition API,播放器在 setPosition 设置的位置之间循环和球员的总持续时间。我需要的是从setPosition设置的
我有一个 html 页面,它使用 Firebase 来获取更新的地理位置数据。然后该数据用于更新谷歌地图中的标记。 map 在笔记本电脑上的 Chrome 浏览器中工作正常( map 渲染,标记相应移
所以我的代码遇到了问题,我尝试从从数据库下载的变量设置谷歌街景位置。它的数据库和 php 端可以工作,但是当我尝试将其分配给“panorama.setPosition(prizeLocation);”
我正在尝试根据平移手势移动一组 CALayers。 我正在使用此代码: -(void)handlePanFrom:(UIPanGestureRecognizer *)recognizer {
我是一名优秀的程序员,十分优秀!