这是目标:
1)从网址获取图片,在本例中为Google Static Maps API
2)将此图像插入Excel工作表。如果我必须创建(或使用现有的)形状并将背景设置为图像,我没关系。我也可以插入特定的细胞。我可以通过Google Static Maps API定义图片大小(请参阅上面的网址),以便始终知道。
我还不完全清楚如何在不首先将文件直接保存到文件系统的情况下执行此操作。
我目前有这样的代码,它以MemoryStream格式获取图像:
public static MemoryStream GetStaticMapMemoryStream(string requestUrl, string strFileLocation)
{
try
{
HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
if (response.StatusCode != HttpStatusCode.OK)
throw new Exception(String.Format(
"Server error (HTTP {0}: {1}).",
response.StatusCode,
response.StatusDescription));
using (BinaryReader reader = new BinaryReader(response.GetResponseStream()))
{
Byte[] lnByte = reader.ReadBytes(1 * 700 * 500 * 10);
using (FileStream lxFS = new FileStream(strFileLocation, FileMode.Create))
{
lxFS.Write(lnByte, 0, lnByte.Length);
}
MemoryStream msNew = new MemoryStream();
msNew.Write(lnByte, 0, lnByte.Length);
return msNew;
}
}
}
catch (Exception e)
{
System.Windows.Forms.MessageBox.Show(e.Message);
return null;
}
}
请注意,在上面代码的中间,我也将图像写入文件系统。如果可能的话,我想避免这一部分。
无论如何,我的代码可以创建一个矩形,调用保存图像的上述序列,然后抓取图像并填充矩形的背景:
Excel.Shape shapeStaticMap = wsNew2.Shapes.AddShape(Office.MsoAutoShapeType.msoShapeRectangle, 0, 0, 700, 500);
string strFileLocation = @"C:\Temp\test.jpg";
MemoryStream newMS = GetStaticMapMemoryStream(strStaticMapUrl, strFileLocation);
shapeStaticMap.Fill.UserPicture(strFileLocation);
所以这里真正的问题是我想要跳过“写入文件然后从文件中获取”来回。这似乎是一个不必要的步骤,我预计它也会变得混乱文件权限和什么不是。
更新
好的,所以我基本上放弃了并使用本地文件离开了它。这工作了一段时间,但现在我正在尝试重新使用此代码从不同来源抓取图像,我不提前知道图像大小。上述方法要求我事先知道图像的尺寸。如何修改上面的代码以动态使用任何图像大小?
答案 0 :(得分:1)
使用此版本的GetStaticMapMemoryStream:
public static MemoryStream GetStaticMapMemoryStream(string requestUrl)
{
try
{
HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
if (response.StatusCode != HttpStatusCode.OK)
throw new Exception(String.Format(
"Server error (HTTP {0}: {1}).",
response.StatusCode,
response.StatusDescription));
var responseStream = response.GetResponseStream();
var memoryStream = new MemoryStream();
responseStream.CopyTo(memoryStream);
memoryStream.Position = 0;
return memoryStream;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}