C#操作Excel文件的图表对象Chart问题

Kw学编程 2014-08-09 12:15:59
我在做一个自动计算导入数据,计算结果,并生成统计图表(柱状图),最后导出为Excel文件。
一开始我开发环境使用office2010 plus,在自己电脑导入导出生成图表一切都正常。后来交由用户使用,却始终提示接口无法转换。我发现用户安装了和我同个程序包安装的office2010 plus后,可以正常导出图表。结合网上的办法,我卸载了我自己的office2010和WPS, 安装了一个office2003 professional edition。希望能和用户一样。

新的问题来了。在我本机也不能导出图表了!!
我是引用的Microsoft.Office.Interop.Excel 版本11.0.0.0 和Office 版本11.0.0.0,现在出现问题 和异常来自 HRESULT:0x800A03EC 的错误。 网上多说是OFFICE版本和注册表的问题,我已经重新安装一次了。

调试过程中,我发现,对EXCEL的图表对象Chart操作时会引发 异常来自 HRESULT:0x800A03EC 的错误。
我把所有对图形对象的操作注释掉后,只 向excel里写数据,【可以】正常导出和生成EXCEL !

求问!为何EXCEL可以写数据,但操作图表对象时就会引发 HRESULT:0x800A03EC 的错误?且我之前的版本是完全可以导出图表的~说明代码没有错误。我将操作图表的代码帖一下。求大神!!

以前的问题都可以在CSDN找到同样的问题和解答,这次没有了。。初次提问,谢谢关注!

/// <summary>
/// 自定义图表
/// </summary>
public void InsertUerDefinedChart(Excel.Worksheet sheet, Excel.XlChartType ChartType,string chartTitle,
int DataSourcesX1, int DataSourcesY1, int DataSourcesX2, int DataSourcesY2,
double plotAreaWidth, double plotAreaHeight,
bool showLegend, bool showLabelValue)
{
// 定义图表
wb.Charts.Add(Type.Missing, Type.Missing, 1, Type.Missing);

// 图表类型
wb.ActiveChart.ChartType = ChartType;// Excel.XlChartType.xlColumnClustered;//簇状柱形图

// 数据源
// 注意指定数据系列是X轴还是Y轴 Excel.XlRowCol.xlColumns
wb.ActiveChart.SetSourceData(sheet.get_Range(sheet.Cells[DataSourcesX1, DataSourcesY1], sheet.Cells[DataSourcesX2, DataSourcesY2]), Excel.XlRowCol.xlColumns);//

// 位置 【【【【【【【【【【异常代码在这里】】】】】】】】】】】】】
wb.ActiveChart.Location(Excel.XlChartLocation.xlLocationAsObject, sheet.Name);//Sheet名 这句没问题
wb.ActiveChart.HasTitle = true;//显示标题 【从该句引发异常,所有对Chart对象的操作都引发异常】
wb.ActiveChart.ChartTitle.Text = chartTitle;//标题内容
wb.ActiveChart.ChartTitle.AutoScaleFont = false;//取消字体大小自动缩放
wb.ActiveChart.ChartTitle.Font.Size = 14;//图表标题字体
wb.ActiveChart.ChartTitle.Font.Bold = true;//加粗
wb.ActiveChart.ChartArea.Width = 600;
wb.ActiveChart.ChartArea.Height = 300;
...全文
501 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyt_2859452494 2014-08-10
  • 打赏
  • 举报
回复
使Excel将数据生成图表实例 //打开选择Excel文件 private void tsbtn_Open_Click(object sender, EventArgs e) { OpenFileDialog openFile = new OpenFileDialog();//实例化打开对话框对象 openFile.Filter = "Excel文件|*.xls";//设置打开文件筛选器 openFile.Title = "打开Excel文件";//设置打开对话框标题 if (openFile.ShowDialog() == DialogResult.OK)//判断是否选择了文件 { tstxt_Excel.Text=openFile.FileName; WBrowser_Excel.Navigate(openFile.FileName);//在窗体中显示Excel文件内容 List<string> P_list_SheetNames = GetSheetName(tstxt_Excel.Text);//获取选中Excel中的所有工作表 tscbox_Sheet.Items.Clear();//清空工具栏中的下拉列表 foreach (string P_str_SheetName in P_list_SheetNames)//遍历工作表集合 { tscbox_Sheet.Items.Add(P_str_SheetName);//将工作表名称显示在下拉列表中 } if (tscbox_Sheet.Items.Count > 0)//判断下拉列表中是否有项 tscbox_Sheet.SelectedIndex = 0;//设置默认选择第一项 } } //生成图表内容 private void tsbtn_Build_Click(object sender, EventArgs e) { CloseProcess("EXCEL");//关闭所有Excel进程 object missing = System.Reflection.Missing.Value;//定义object缺省值 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//实例化Excel对象 //打开Excel文件 Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(tstxt_Excel.Text, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); Microsoft.Office.Interop.Excel.Worksheet worksheet;//声明工作表 worksheet = ((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[tscbox_Sheet.Text]);//获取选择的工作表 Microsoft.Office.Interop.Excel.Range searchRange = worksheet.get_Range("A1", "E1");//定义标题范围 object[] P_obj_Items = { "苹果手机", "技嘉主板", "福喜家园奶糖", "桥牌麻将", "果子狸酒杯" }; searchRange.set_Value(missing, P_obj_Items);//绘制标题 searchRange.Font.Bold = true;//设置字体加粗 searchRange.Font.Name = "宋体";//设置字体样式 searchRange.Font.Size = 10;//设置字体大小 searchRange.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;//设置标题对齐方式 //获得要生成图表的数据 for (int i = 0; i < 13; i++) { worksheet.Cells[2 + i, 1] = i; worksheet.Cells[2 + i, 2] = i + 1; worksheet.Cells[2 + i, 3] = i + 2; worksheet.Cells[2 + i, 4] = i + 3; worksheet.Cells[2 + i, 5] = i + 4; } //实例化Excel绘图对象 Microsoft.Office.Interop.Excel.Chart chart = (Microsoft.Office.Interop.Excel.Chart)workbook.Charts.Add(missing, missing, missing, missing); Microsoft.Office.Interop.Excel.Range chartRange = worksheet.get_Range("A1:A14", "B1:E14");//定义绘制图表范围 //在指定范围绘制图表 chart.ChartWizard(chartRange, Microsoft.Office.Interop.Excel.XlChartType.xl3DColumn, missing, Microsoft.Office.Interop.Excel.XlRowCol.xlColumns, 1, 1, true, "多糖商品销量分析", "月份", "销量", missing); excel.DisplayAlerts = false;//设置保存Excel时不显示对话框 workbook.Save();//保存工作簿 workbook.Close(false, missing, missing);//关闭工作簿 CloseProcess("EXCEL");//关闭所有Excel进程 WBrowser_Excel.Navigate(tstxt_Excel.Text);//在窗体中重新显示Excel文件内容 }//CodeGo.net/ //获取所有工作表名称 private List<string> GetSheetName(string P_str_Excel) { List<string> P_list_SheetName = new List<string>();//实例化泛型集合对象 //连接Excel数据库 OleDbConnection olecon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + P_str_Excel + ";Extended Properties=Excel 8.0"); olecon.Open();//打开数据库连接 System.Data.DataTable DTable = olecon.GetSchema("Tables");//实例化表对象 DataTableReader DTReader = new DataTableReader(DTable);//实例化表读取对象 while (DTReader.Read())//循环读取 { string P_str_Name = DTReader["Table_Name"].ToString().Replace('$', ' ').Trim();//记录工作表名称 if (!P_list_SheetName.Contains(P_str_Name))//判断泛型集合中是否已经存在该工作表名称 P_list_SheetName.Add(P_str_Name);//将工作表名添加到泛型集合中 } DTable = null;//清空表对象 DTReader = null;//清空表读取对象 olecon.Close();//关闭数据库连接 return P_list_SheetName;//返回得到的泛型集合 } //字符限制原因此处(略过)
Kw学编程 2014-08-09
  • 打赏
  • 举报
回复
引用 1 楼 ktcserver 的回复:
"异常来自 HRESULT:0x800A03EC "的原因 一不小心就会出"异常来自 HRESULT:0x800A03EC "的异常,原因很简单,Excel的行列都是从1开始的,如果我们习惯性的给worksheet.Cells[0, 0]或者worksheet.Cells[1, 0]或者worksheet.Cells[0, 1]赋值,就会引发该异常。
网上有这么说,但是好像并不是这样。我所有下标均从2开始,所以没有这个可能。 另外,我的代码是没有错误的,因为之前的版本是可以正常导出的
ktcserver 2014-08-09
  • 打赏
  • 举报
回复
"异常来自 HRESULT:0x800A03EC "的原因 一不小心就会出"异常来自 HRESULT:0x800A03EC "的异常,原因很简单,Excel的行列都是从1开始的,如果我们习惯性的给worksheet.Cells[0, 0]或者worksheet.Cells[1, 0]或者worksheet.Cells[0, 1]赋值,就会引发该异常。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧