假如:我有5列、4行的数据。我选择这些数据生成了自动的折线图。 当我改其中5列中任意数据时,折线图他会自动改变。。。。 (这里我都会做)
但是,当我要添加新的列数或行数时(就是5列我要变成6列或4行我要变成5行时)之前生所好的折线图,不会根据我新加的列数或行数而改变。。。。(这里我不会做)
我现在就要问:添加列或行的数据,希望折线图也更着添加和改变。
谢高手赐教,谢谢
PS:要用到excel的指定宏吗?
要重新设置数据源,我教你个办法,你使用Excel的录制宏的方式,然后手动把你的流程操作一遍,然后通过VBA编辑器查看自动录制的宏中的代码,你再把它改写成C#就行了。
能说一下具体步骤吗?? 我不知道写C#。我只是一个美工。非常感谢哈
@乃馨: 在你已经生成的折线图上点击鼠标右键,选择“选择数据”;在弹出的“选择数据源”的对话框上,点击图示按钮:
然后用鼠标在你的数据区域里选择新的数据:
@Launcher: 这些我知道。我是不知道你说的怎么录制宏???之后改成怎么样的C#了。主要是怎么写C#呢???谢谢
@乃馨: 在菜单上选择“开发工具”,如图:
@乃馨: 你到底是想用C#代码来编写Excel绘制折线图的程序,还是只是想知道怎么用Excel绘制折线图?
@Launcher: 通过VBA编辑器查之后,那怎么写C#呢?
@乃馨: 我己经看到了,自动录制的宏中的代码。就是不知道怎么改写成C#
@Launcher: 我己经看到了,自动录制的宏中的代码。就是不知道怎么改写成C#
@乃馨: 你之前用C#写的生成折线图的代码有吗?贴出来。把你录制的宏代码也贴出来。
@Launcher: 这个是录制宏的代码。 也不知道录制的对不对
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("'Sheet2'!$A$1:$E$6")
ActiveChart.ChartType = xlLine
Application.Goto Reference:="Macro1"
End Sub
@乃馨: 你的C#代码呢?
@Launcher: 不知道。我第二次点看的时候。代码又变了。又成这样了
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("'Sheet2'!$A$1:$E$6")
ActiveChart.ChartType = xlLine
Application.Goto Reference:="Macro1"
ActiveChart.Legend.Select
ActiveSheet.ChartObjects("图表 1").Activate
ActiveChart.ChartArea.Select
ActiveSheet.ChartObjects("图表 1").Activate
Application.Goto Reference:="Macro1"
ActiveSheet.ChartObjects("图表 1").Activate
Application.Goto Reference:="Macro1"
End Sub
我们公司不可以上传东西。所以我没法发图片给你。
@Launcher:
设备名称 | Nov-12 | Dec-12 | Jan-13 | Feb-13 |
BSC6900-GO-UO-GU-Electrical_TEST | 4 | 4 | 3 | 0 |
GGSN9811-NE80-E_TEST | 3 | 5 | 2 | 0 |
UMG8900-SSM-32_TEST | 2 | 2 | 1 | 0 |
SGSN9810-ATCA_TEST | 0 | 8 | 0 | 10 |
UMG8900-SSM-32_TEST | 5 | 4 | 3 | 3 |
这个是我的excel表格里的内容。是要在这个行与列自动加数据的,折线图也就知道变的。
@乃馨: 你可以停止录制,开启录制的情况下它会一直录制你的动作。你不给代码,我就给你连接,自己学习怎么用C#操作Excel。
@Launcher: 看不懂。我不懂程序。 录制是一开始做折线图时就录制还是半路上录制啊。停止是在看录制宏的代码时,停止是吗?
@乃馨: 你不懂程序,那你干嘛让我教你怎么写C#代码?你是没事逗我玩吗?
@Launcher: 谢谢你了,我去问一下我们程序员看他看的懂,你发的这个链接不
@Launcher: 不是啊。我们程序员说这个excel是我应该要做的。是我的工作职责啊。可是我不知道做。我也一开始不知道要用程序啊。。。。可是你不教我,那我就不知道做啊。我不知道做那我的工作就没法完成啊。我不是没事啊。这个excel弄了我两天了。我都没有改出来。好不容易今天碰到你,至少知道要用C#去写。
@乃馨: 不用C#写啊,大哥!你看我给你的截图,直接用手在Excel上操作就能做啊!我以为你要用代码写,而你又不知道如何实现,我就是告诉你一个方法,如果不知道代码怎么写,通过录制宏,你就可以知道代码该怎么写了。也就是说,只要用手操作能够在Excel上完成的工作,你都可以通过代码来实现。
@Launcher: 现在我知道要用程序去写,我就也好给我们程序员一个答复啊。。。。
还有,我以为写那C#只要一点点代码,我以为写那C#代码只要一点点,很简单。所以才要你教我一下怎么写。我还以为,你写完告诉我,我一复制过去就可以了。我就这么认为的,所以才要你教一下我的啊。。。。谢谢了。不好意思,耽误你时间了。
@Launcher: 不好意思,我不是大哥。 我是按你的方法用手在Excel上操作的啊。我也录制了宏啊。我也看到了录制了宏的代码啊。就是不知道怎么把他改写成C#啊。你发的那链接我看不懂,等一下我问一下程序员吧。他现在很忙。
@乃馨: 我的意思是你不需要写代码就能实现数据表变动后重新生成折线图的操作,如果你要把这个过程通过代码来实现的话,可以通过宏录制来知道具体的代码该如何实现。
@Launcher: 咦,到底要不要用C#啊???要是不要用C#,不要用程序。只需要在excel里操作,就能达到我的效果。那这个活还是得我做啊。 如果要用宏的代码改成c#,我就找我们程序员吧。那到底要不要用C#呢????
@乃馨: 我快崩溃了,你们的需求到底是啥啊?
@Launcher: 哎。。。你看了。
设备名称 | Nov-12 | Dec-12 | Jan-13 | Feb-13 |
BSC6900-GO-UO-GU-Electrical_TEST | 4 | 4 | 3 | 0 |
GGSN9811-NE80-E_TEST | 3 | 5 | 2 | 0 |
UMG8900-SSM-32_TEST | 2 | 2 | 1 | 0 |
SGSN9810-ATCA_TEST | 0 | 8 | 0 | 10 |
UMG8900-SSM-32_TEST | 5 | 4 | 3 | 3 |
这里的每一条数据都是后台程序自动添加到表格去的。。。。现在后台只有6行5列的数据。但是也有可能会有很多条,也就是说可能有8行9列的数据,甚至有几百行或几百列的数据。所以我在excel里要做好只要有新加的一条数据,折线图也就要跟着变化。现在是表格是6行5列的数据,折线图显示的也就是6行5列的数据,如果表格数据达到了8行9列,我的折线图也要跟着变成8行9列的数据。
@乃馨: 如果你这个文件是个模板的话,你需要通过VBA代码来实现,在 Sheet_change 事件中重新设置数据源(就是用那段录制的VBA代码)。当然这有个问题,就是你的VBA代码:ActiveChart.SetSourceData Source:=Range("'Sheet2'!$A$1:$E$6") 中,如何确定新的数据区域的范围。
这里有个关键问题,就是你的数据是怎么更新进你当前这个工作表的。
请仔细观察上图,蓝色线框起的是原始的数据表,当你在红圈 1 输入 E 的时候,它会自动新建一列,同时更新红圈 3 的图形;当你在红圈 2 输入 34 时,它会自动新建一行,同时更新红圈 3 的图形。
我还是不太明白你的需求,你没把需求讲清楚。你只说了表格行列会变,但是你没说明这种变化是如何触发,以及它变动的环境是什么。
@Launcher: 对。我要的效果就是你说的这个样子的。(蓝色线框起的是原始的数据表,当你在红圈 1 输入 E 的时候,它会自动新建一列,同时更新红圈 3 的图形;当你在红圈 2 输入 34 时,它会自动新建一行,同时更新红圈 3 的图形。)。如何触发的我不知道,以及它变动的环境是什么,我也不知道。 程序员说只要我在excel里能实现你说的这个就可以了。(蓝色线框起的是原始的数据表,当你在红圈 1 输入 E 的时候,它会自动新建一列,同时更新红圈 3 的图形;当你在红圈 2 输入 34 时,它会自动新建一行,同时更新红圈 3 的图形。)其它我不需要管的。现在我能插红圈 1 和红圈 2.但是红圈 3 不跟着变。
@乃馨: 你仔细看我的图,你的那个数据表是通过插入一个数据表来实现的吗?
@Launcher: 哦。还有 确定新的数据区域的范围 这个是不能确定的,也确定不了,因为不知道后台数据有多少条数据。所以没法确定。 哎,我只要在excel实现 (蓝色线框起的是原始的数据表,当你在红圈 1 输入 E 的时候,它会自动新建一列,同时更新红圈 3 的图形;当你在红圈 2 输入 34 时,它会自动新建一行,同时更新红圈 3 的图形。)。
@乃馨: 我很想知道“程序员说只要我在excel里能实现你说的这个就可以了”的这句话到底是什么含义?是说只要你能在Excel中实现,他就可以用C#代码来实现吗?
@Launcher: 数据是自己写的。都是自己写的。反正只要我在excel里能实现这个效果就可以了(蓝色线框起的是原始的数据表,当你在红圈 1 输入 E 的时候,它会自动新建一列,同时更新红圈 3 的图形;当你在红圈 2 输入 34 时,它会自动新建一行,同时更新红圈 3 的图形。)。 至于后面那数据来是怎么来的我不管。只excel里能实现这个效果就可以了能
@乃馨:
@乃馨: 你仔细看我的图,你的那个数据表是通过插入一个数据表来实现的吗?
@Launcher: 对的。是的。只要我在Excel中能实现就可以了。
@乃馨: 那你让他看我给你贴的代码吧,他只要用代码重新设置一下图形的数据源就行了。
你仔细看我的图,你的那个数据表是通过插入一个数据表来实现的吗?
是程序员用记事本发给我的数据。是我一个一字打进excel里的。 这些数据是用来让我做效果的,做测试的。没什么意义。 反正只要我在Excel中能实现就可以了(当你在红圈 1 输入 E 的时候,它会自动新建一列,同时更新红圈 3 的图形;当你在红圈 2 输入 34 时,它会自动新建一行,同时更新红圈 3 的图形。)
@Launcher: 你没给我代码。你是说让他看这个网址是不?http://support.microsoft.com/kb/302084?wa=wsignin1.0
@乃馨: 是,看那个连接就行了。我可以这么告诉你,只要他会用C#代码来在Excel上绘折线图,他就一定会在数据行列变化后去更新折线图。
@Launcher: 好了。我给他看。谢谢你啊。非常感谢啊。真的。谢谢
@Launcher: 哦。我问你哦,他看完那链接就真的会吗?就真可以吗?他现在在忙...
@乃馨: 他会不会,我不知道。我只知道没有人天生就会,都是通过学习掌握的。
@Launcher: 我的意思是说那链接写的够清楚,够明白不?一般的程序员看了应该都会吧????
@乃馨: 应该很清楚了吧,是傻瓜式的的教程啊。
@Launcher: 汗,还傻瓜式...........
@Launcher: 您好,你还在吗?我还有一点小小问题。
就是,按你的方法,是做出来了。但做出来了,是柱形图。我现在想把柱形图改成折线图。是要改那个属性啊
@乃馨: 还是在图形上点击鼠标右键,选择“更改图表类型”。
@Launcher: 要是直接用程序操作呢?不用手工的了?
@乃馨: 你还是使用录制宏的功能,看一下 VBA 的代码是什么。
@Launcher: 还有个问题,我点击按钮执行你的方法后,excel文件直接打开了。那个文件是在那存储啊????我想知道文件存储的路径是在那里,之后操作它。
@乃馨: 不明白你说的啥。
@Launcher: 我通过你这个地址http://support.microsoft.com/kb/302084?wa=wsignin1.0 得到了excel
@Launcher: 我通过你这个地址http://support.microsoft.com/kb/302084?wa=wsignin1.0 得到了excel的柱形图。。。但是我想得到折线图。。。。。我要怎么把柱形图改成折线图。是应该改那个属性啊???
@乃馨: 我白教你这么多东西,到了最后,我还得给你写代码。
oChart.ChartWizard( oResizeRange, Excel.XlChartType.xl3DColumn, Missing.Value,
Excel.XlRowCol.xlColumns, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value );
改成:
oChart.ChartWizard( oResizeRange, Excel.XlChartType.xlLine, Missing.Value,
Excel.XlRowCol.xlColumns, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value );
@Launcher: 汗,我是一点都没有听懂啊。。。。我就是个传声桶。。。真是辜负你的好意了啊。对不起啊
我喜欢做设计,之后切图(DIV+CSS)。现在我喜欢学JS。 可是我JS又不懂。师傅啊,要不你做我师傅了。你会这么多语言,肯定很精通JS
@乃馨: 很多都不会,不会JS啊!
@Launcher: 是啊。我一直很想学JS. 但是还没学会啊。。。我的DIV+CSS,是一个对我可好的师傅教我的。
@Launcher: 哦。我们程序员还有一个问题,
怎么能不让excel文件直接打开而是直接存储在服务器的某个位置上
也就是说我现在点击按钮后的效果是直接打开了生成后的一个EXCEL文件 ,我想要的效果是不开文件而是返回生成后的EXCEL文件路径 字符串。那么应该注释那些代码 和添加那个代码
@乃馨: oXL.Visible = true; 改为 oXL.Visible = false;
然后增加:
oXL.SaveAs("这里填写你要保存的文件名", Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
@乃馨: 你的意思是只有师傅对你好,你才学的会?
@Launcher: 不是拉。我没这么懒了。意思误解了,我师傅对所有人都好。。。。
你就给我指点指点了。。。我很想真心实地的学JS。
@Launcher: 师傅啊,你就勉完其难的收下我这个啥都不会的童鞋吧。我是真的想要学好JS的。
@乃馨: 可我真的不会JS。
@Launcher: 还有两个问题。要麻烦你。真的真的不好意思。
问下oXL类中无SaveAs()方法
增加保存方法时报错找不到SaveAs()方法
@Launcher: 真的吗?有点不太相信哦!要是你真不会,那你也还是做我师傅了。我觉得你人挺好的
@乃馨: oWB.SaveAs
@乃馨: 你这是赖上我了啊!我是真不会JS啊!!!!
@Launcher: 不会也行啊。反正也教了这么多了。不一定要很懂。只要能够指点就可以了。我是觉得你指点我是完全有能力的。
@乃馨: 我被你打败了.....
@Launcher: 师傅,我们程序员和我说了,问题都解决了哦。OK了。辛苦了哈
@Launcher: 不对。他又说还有一个。
还有一个就是怎么把报表和数据放在不同的Sheet中,Sheet1放报表Sheet2放数据
@乃馨: 他有可能少了一步,就是 SaveAs 完了后,记得关闭 Excel 进程:
oWB..Close(Missing.Value, Missing.Value, Missing.Value);
oXL.Workbooks.Close();
oXL.Quit();
@Launcher:
Excel.Worksheet sheet1 = (Excel.Worksheet)oWB.Sheet[1];
Excel.Worksheet sheet2 = (Excel.Worksheet)oWB.Sheet[2];
Excel.Worksheet sheet3 = (Excel.Worksheet)oWB.Sheet[3];
@Launcher: 谢谢。师傅下班了,回家了。呵呵
@Launcher:还有个问题,打扰一下哈
这个是数据源,行和列都是动态的。想问一下怎么把数据源填充到表格里???并和报表关联。就类似于下图。
public DataTable GetDt()
{
DataTable table = new DataTable();
DataColumn column;
DataRow row;
column = new DataColumn();
column.DataType = System.Type.GetType("System.String");
column.ColumnName = "Mdate";
table.Columns.Add(column);
column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "BSC6900-GO-UO-GU-Electrical_TEST";
table.Columns.Add(column);
column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "BTS3900-GO-UO-GU_TEST";
table.Columns.Add(column);
column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "GGSN9811-NE80-E_TEST";
table.Columns.Add(column);
column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "MSOFTX3000-CPCI_TEST2";
table.Columns.Add(column);
column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "SGSN9810-ATCA_TEST";
table.Columns.Add(column);
column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "UMG8900-SSM-32_TEST";
table.Columns.Add(column);
string[] are = new string[12];
for (int i = 0; i < 12; i++)
{ row = table.NewRow();
row["Mdate"] = are[i] = DateTime.Now.AddMonths(-i).ToString("yyyy-MM");
row["BSC6900-GO-UO-GU-Electrical_TEST"] = 2000 + i;
row["BTS3900-GO-UO-GU_TEST"] = 1400 + i;
row["GGSN9811-NE80-E_TEST"] = 1500 + i;
row["MSOFTX3000-CPCI_TEST2"] = 1700 + i;
row["SGSN9810-ATCA_TEST"] = 2100 + i;
row["UMG8900-SSM-32_TEST"] = 1800 + i;
table.Rows.Add(row);
}
return table;
}
@乃馨: 说实话,这些问题我都懒的回答了,你自己到网上搜下嘛,连这点自学能力都没有,别编程了,该行吧。
object[,] objValues = new object[gridView.RowCount, 1]; //object[,] objValues = (object[,])Activator.CreateInstance(Type.GetType(string.Format("{0}[,]", gridView.Columns[y].ValueType)), gridView.RowCount, 1); for (int row = 0; row < gridView.RowCount; row++) objValues[row, 0] = gridView.Rows[row].Cells[y].FormattedValue;
// 填充列数据。 Excel.Range rng = ((Excel.Range)appExcel.Cells[2, y + 1]).get_Resize(gridView.RowCount, 1); rng.NumberFormatLocal = "@"; rng.ColumnWidth = gridView.Columns[y].Width / 6.5;
if (gridView.Columns[y].DefaultCellStyle.Alignment == DataGridViewContentAlignment.MiddleCenter) rng.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; else if (gridView.Columns[y].DefaultCellStyle.Alignment == DataGridViewContentAlignment.MiddleLeft) rng.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft; else if (gridView.Columns[y].DefaultCellStyle.Alignment == DataGridViewContentAlignment.MiddleRight) rng.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;
foreach (var value in objValues) { if (value.ToString().Length >= 140) { rng.NumberFormatLocal = "G"; break; } }
rng.Value2 = objValues;
@Launcher: 师傅啊,你这一巴撑是打在我脸上啊。我不知道怎么说了。
@Launcher: 我真不知道要怎么说了。他本想还有个问题的。要我问完这个再问下一个了。
虽然我没有做过程序,但我知道这问题应该是简单的。网上肯定有的。
你这一撑叫我如何是好。左右为难了,师傅耶。
我要是知道,我就百度给他了。
@乃馨:要代码的话,去下载一个 Microsoft All-In-One Code Framework Sample Browser 。
@Launcher: 嗯。嗯。我和他说。师傅你天天在博客园啊,你不要做事吗?
@乃馨: 编译程序时,我就来看一下。
@Launcher: 哇。那我来找你,这么巧。你就在。哈哈哈
@乃馨: 我一直在这里等你,你是不是很开心?
@Launcher: 哈哈。。。你真会开玩笑。。。。
你不是说你都懒得说了吗?
@乃馨: 以前我都不来博客园的,我都不知道有这么一个博客园。不过现在我也不是很喜欢博客园,我好像找不到自己需要的内容。可能是不会找。
@乃馨: 不要在帖子里聊天。
@Launcher: 还在吗?能在问一个问题吗?
报表图片的位置在那定位 怎么定位
谢谢哈
@乃馨: 啥是报表图片?