我有一個Excel文件,它有一個圖表,這些圖表表示的是列中的數據,在我的程序中,我還在列中更改了這些數據,並且還更改了圖表更改,之後,我將這些圖表導出爲.png文件,但我遇到了一個異常HRESULT:0x80030020(STG_E_SHAREVIOLATION)將excel圖表導出爲圖像
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using RTO.Models;
using Novacode;
using System.Drawing;
using Word = Microsoft.Office.Interop.Word;
using System.Reflection;
using CommonLib.SharedModels;
namespace RTO
{
class Program
{
public static void ReportRTO(RtoCommonData cmnData, List<Antenna> antennas)
{
Novacode.Image imageh, imagev, image1, image2;
Picture pictureh, picturev, picture1, picture2;
Paragraph pimg;
var exApp = new Excel.Application();
exApp.ScreenUpdating = false;
var exBook = exApp.Workbooks.Open(fileLeaf);
var exSheet = exBook.Worksheets[1] as Excel.Worksheet;
Excel.Range r1 = exSheet.get_Range("A1", "A360");
Excel.Range r2 = exSheet.get_Range("B1", "B360");
double[,] d1 = new double[360, 1];
double[,] d2 = new double[360, 1];
int w = 1;
var application = new Excel.Application();
application.ScreenUpdating = false;
var workbook = application.Workbooks.Open(fileExcel);
var worksheet = workbook.Worksheets[1] as Excel.Worksheet;
Excel.Range rng1 = worksheet.get_Range("A1", "A361");
Excel.Range rng2 = worksheet.get_Range("B1", "B361");
Excel.Range rng3 = worksheet.get_Range("C1", "C361");
Excel.Range rng4 = worksheet.get_Range("D1", "D361");
double[,] data1 = new double[361, 1];
double[,] data2 = new double[361, 1];
double[,] data3 = new double[361, 1];
double[,] data4 = new double[361, 1];
int flnmadd = 1;
for (int i = 0; i < antennas.Count; i++)
{
//Save chart as image
w = 1;
foreach (Excel.Worksheet ws in exBook.Worksheets)
{
Excel.ChartObjects chartObjects = (Excel.ChartObjects)(ws.ChartObjects(Type.Missing));
foreach (Excel.ChartObject co in chartObjects)
{
co.Select();
Excel.Chart chart = co.Chart;
chart.Export(exportPath + @"\leaf" + w + ".png", "PNG", false);
w++;
}
}
//Insert image to doc
image1 = doc.AddImage(leafimg1);
picture1 = image1.CreatePicture();
picture1.Width = 310;
picture1.Height = 310;
image2 = doc.AddImage(leafimg2);
picture2 = image2.CreatePicture();
picture2.Width = 310;
picture2.Height = 310;
pimg = doc.InsertParagraph();
pimg.AppendPicture(picture1);
pimg.AppendPicture(picture2);
for (int j = 0; j < boztrows; j++)
{
data1[j, 0] = sumbozres[i].Rxhor[j];
data2[j, 0] = sumbozres[i].Rzhor[j];
data3[j, 0] = sumbozres[i].Rxver[j];
data4[j, 0] = sumbozres[i].Rzver[j];
}
data1[boztrows, 0] = data1[0, 0];
data2[boztrows, 0] = data2[0, 0];
data3[boztrows, 0] = data3[0, 0];
data4[boztrows, 0] = data4[0, 0];
rng1.Value = data1;
rng2.Value = data2;
rng3.Value = data3;
rng4.Value = data4;
//Save chart as image
flnmadd = 1;
foreach (Excel.Worksheet ws in workbook.Worksheets)
{
Excel.ChartObjects chartObjects = (Excel.ChartObjects)(ws.ChartObjects(Type.Missing));
foreach (Excel.ChartObject co in chartObjects)
{
co.Select();
Excel.Chart chart = co.Chart;
chart.Export(exportPath + @"\charthv" + flnmadd + ".png", "PNG", false);
flnmadd++;
}
}
//Insert image to doc
if (antennas[i].Type == "БС")
{
imageh = doc.AddImage(charthimg);
pictureh = imageh.CreatePicture();
pictureh.Width = 624;
pictureh.Height = 357;
imagev = doc.AddImage(chartvimg);
picturev = imagev.CreatePicture();
picturev.Width = 624;
picturev.Height = 156;
pimg = doc.InsertParagraph();
pimg.AppendPicture(pictureh);
pimg = doc.InsertParagraph();
pimg.AppendPicture(picturev);
}
else if (antennas[i].Type == "РРС")
{
imageh = doc.AddImage(rrsimg);
pictureh = imageh.CreatePicture();
pictureh.Width = 624;
pictureh.Height = 156;
pimg = doc.InsertParagraph();
pimg.AppendPicture(pictureh);
}
trsprev += trs;
freqs = "";
pows = "";
koefgs = "";
koefgrazs = "";
poteri = "";
poteriraz = "";
freqAvg = 0;
}
exBook.Save();
exBook.Close();
exApp.Workbooks.Close();
exApp.Quit();
workbook.Save();
workbook.Close();
application.Workbooks.Close();
application.Quit();
}
}
}
此處顯示異常:chart.Export(exportPath + @「\ leaf」+ w +「.png」,「PNG」,false); –
STG_E_SHAREVIOLATION:「訪問被拒絕,因爲另一個調用者打開並鎖定文件」。猜測是您被拒絕訪問,因爲具有相同文件名的舊文件已打開/正在使用中。在重新運行之前是否刪除了舊文件? – NLindbom
@Nindind你是對的,問題是因爲我在循環中創建和保存相同的.png文件具有相同的名稱。首先,我試圖在每次迭代後刪除文件,但出現「無法刪除,因爲此文件已打開」等錯誤。所以,我通過爲每個圖表創建不同的.png文件來解決問題。但是,這是一個好方法嗎?還是有另一個更好? –