如何在 Visual Studio 2010 中使用 Crystal Reports 创建报表
Posted
技术标签:
【中文标题】如何在 Visual Studio 2010 中使用 Crystal Reports 创建报表【英文标题】:How To Create Reports Using Crystal Reports in Visual Studio 2010 【发布时间】:2011-10-20 14:19:23 【问题描述】:我是 Visual Studio 2010 C# 的新手。我正在创建一个创建报告的应用程序。报告中将显示的信息来自 mysql 服务器。我已经安装了水晶报表。但是,我在从 MySQL 获取数据时确实遇到了一些问题,因为我无法从 MySQL 中找到数据。报告创建向导中显示的数据不是 MySQL 中的数据库文件,而是我在 C# 中创建的表单。请帮忙。
截图:
【问题讨论】:
标签“reporting-services”对您的问题无效 您应该创建一个新连接以查看您的 mysql 数据库。 【参考方案1】:DataAccess.Connection.Close();
DataAccess.Connection.Open();
DataAccess.dataAdapter = new SqlDataAdapter(" SELECT sales.qty, sales.ord_date, sales.payterms, stores.stor_name, stores.stor_id, titles.title_id, titles.title, titles.price, (sales.qty * titles.price) AS Total FROM sales INNER JOIN stores ON sales.stor_id = stores.stor_id INNER JOIN titles ON sales.title_id = titles.title_id", DataAccess.Connection);
DataAccess.dataTable = new DataTable();
DataAccess.dataAdapter.Fill(DataAccess.dataTable);
Bind.DataSource = DataAccess.dataTable;
string temp = DataAccess.dataTable.Rows[0][3].ToString();
Excel.Application xlApp2 = new Excel.Application();
xlApp2.Visible = true;
Excel.Workbook Workbook2 = xlApp2.Workbooks.Add(1);
Excel.Worksheet Worksheet2 = (Excel.Worksheet)Workbook2.Sheets[1];
Worksheet2.Cells[1, 1] = "Sales Report";
Worksheet2.Cells[3, 1] = temp.ToUpper();
Worksheet2.Cells[4, 2] = "Order Date";
Worksheet2.Cells[4, 3] = "Payment Terms";
Worksheet2.Cells[4, 4] = "Store Name";
Worksheet2.Cells[4, 5] = "Store ID";
Worksheet2.Cells[4, 6] = "Title ID";
Worksheet2.Cells[4, 7] = "Book Title";
Worksheet2.Cells[4, 8] = "Unit Price";
Worksheet2.Cells[4, 9] = "Total Price";
int intCount2 = 5;
int TotalRec = 0;
int finecort = 0;
decimal cost = 0;
decimal cost1 = 0;
for (int n = 0; n < DataAccess.dataTable.Rows.Count; n++)
if (DataAccess.dataTable.Rows[n][3].ToString().Equals(temp))
Worksheet2.Cells[intCount2, "C"] = DataAccess.dataTable.Rows[n][0];
Worksheet2.Cells[intCount2, "B"] = DataAccess.dataTable.Rows[n][1];
Worksheet2.Cells[intCount2, "D"] = DataAccess.dataTable.Rows[n][3];
Worksheet2.Cells[intCount2, "E"] = DataAccess.dataTable.Rows[n][4];
Worksheet2.Cells[intCount2, "F"] = DataAccess.dataTable.Rows[n][5];
Worksheet2.Cells[intCount2, "G"] = DataAccess.dataTable.Rows[n][6];
Worksheet2.Cells[intCount2, "H"] = DataAccess.dataTable.Rows[n][7];
Worksheet2.Cells[intCount2, "I"] = DataAccess.dataTable.Rows[n][8];
intCount2++;
TotalRec++;
finecort++;
cost += Convert.ToDecimal(DataAccess.dataTable.Rows[n][8]);
cost1 += Convert.ToDecimal(DataAccess.dataTable.Rows[n][8]);
else
Worksheet2.Cells[intCount2, "B"] = ("Number of records in " + temp + " group are" + TotalRec + " and the cost is R" + cost1);
TotalRec = 0;
cost1 = 0;
temp = DataAccess.dataTable.Rows[n][3].ToString();
Worksheet2.Cells[intCount2 + 2, "A"] = temp.ToUpper();
Worksheet2.Cells[intCount2 + 3, "B"] = "Order Date";
Worksheet2.Cells[intCount2 + 3, "C"] = "Quantity";
Worksheet2.Cells[intCount2 + 3, "D"] = "Store Name";
Worksheet2.Cells[intCount2 + 3, "E"] = "Store ID";
Worksheet2.Cells[intCount2 + 3, "F"] = "Title ID";
Worksheet2.Cells[intCount2 + 3, "G"] = "Book Title";
Worksheet2.Cells[intCount2 + 3, "H"] = "Unit Price";
Worksheet2.Cells[intCount2 + 3, "I"] = "Total Price";
intCount2 += 4;
Worksheet2.Cells.Columns.AutoFit();
Worksheet2.Cells[intCount2, "B"] = ("Number of records in " + temp + " group=" + TotalRec);
Worksheet2.Cells[intCount2 + 2 ,"A"] = "2013 Sales Report records added upto ";
Worksheet2.Cells[intCount2 + 2, "B"] = finecort;
Worksheet2.Cells[intCount2 + 3, "A"] = "Grrand Total of all records ";
Worksheet2.Cells[intCount2 + 3, "B"] = "R"+cost;
Worksheet2.Range[Worksheet2.Cells[1, "A"], Worksheet2.Cells[1, "I"]].Merge();
Worksheet2.Cells.Columns.AutoFit();
DataAccess.Connection.Close();
【讨论】:
这个答案对于在 MySQL 上创建 Crystal Reports 报表意味着什么?【参考方案2】: XmlDocument xmlDocument = new XmlDocument();
string xmlFileName = (@"C:");
xmlDocument.Load(xmlFileName);
XmlElement xItem = xmlDocument.CreateElement("item");
XmlElement xmlSubElement1 = xmlDocument.CreateElement("todoID");
xmlSubElement1.InnerText = todoID;
xItem.AppendChild(xmlSubElement1);
XmlElement xmlSubElement2 = xmlDocument.CreateElement("todoDate");
xmlSubElement2.InnerText = todoDate;
xItem.AppendChild(xmlSubElement2);
XmlElement xmlSubElement3 = xmlDocument.CreateElement("todoTime");
xmlSubElement3.InnerText = todoTime;
xItem.AppendChild(xmlSubElement3);
XmlElement xmlSubElement4 = xmlDocument.CreateElement("todoItem");
xmlSubElement4.InnerText = todoItem;
xItem.AppendChild(xmlSubElement4);
XmlElement xmlSubElement5 = xmlDocument.CreateElement("todoStatus");
xmlSubElement5.InnerText = todoStatus;
xItem.AppendChild(xmlSubElement5);
XmlElement xmlSubElement6 = xmlDocument.CreateElement("UserID");
xmlSubElement6.InnerText = UserID;
xItem.AppendChild(xmlSubElement6);
//xmlDocument.AppendChild(xItem);
xmlDocument.DocumentElement.LastChild.AppendChild(xItem);
// then finally save
xmlDocument.Save(@"C:");
xmlmsg ="A new item has been added to the to do list";
【讨论】:
【参考方案3】: private void btndlt_Click(object sender, EventArgs e)
DataGridViewRow row = dataGridView1.Rows[0];
string id = row.Cells[0].Value.ToString();
string path = @"";
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNode node = doc.SelectSingleNode("/TheToDoList/item[todoID='" + id + "']");
node.ParentNode.RemoveChild(node);
doc.Save(path);
MessageBox.Show("Selected Record Deleted Successfully");
private void btnUpdate_Click(object sender, EventArgs e)
DataGridViewRow row = dataGridView1.Rows[0];
int id1 = Convert.ToInt32(row.Cells[0].Value);
string path = @"";
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNode node = doc.SelectSingleNode("/TheToDoList/item[todoID='" + id1 + "']");
node.ParentNode.RemoveChild(node);
doc.Save(path);
// //Load the XML File
doc.Load(path);
XmlElement root = doc.CreateElement("TheToDoList");
XmlElement Subroot = doc.CreateElement("item");
XmlElement todoID = doc.CreateElement("todoID");
XmlElement todoDate = doc.CreateElement("todoDate");
XmlElement todoTime = doc.CreateElement("todoTime");
XmlElement todoItem = doc.CreateElement("todoItem");
XmlElement todoStatus = doc.CreateElement("todoStatus");
XmlElement UserID = doc.CreateElement("UserID");
//Add the values for each nodes
todoID.InnerText = row.Cells[0].ToString();
todoDate.InnerText = row.Cells[1].ToString();
todoTime.InnerText = row.Cells[2].ToString();
todoItem.InnerText = row.Cells[3].ToString();
todoStatus.InnerText = row.Cells[4].ToString();
UserID.InnerText = row.Cells[5].ToString();
//Construct the document
doc.AppendChild(root);
root.AppendChild(Subroot);
Subroot.AppendChild(todoID);
Subroot.AppendChild(todoDate);
Subroot.AppendChild(todoTime);
Subroot.AppendChild(todoItem);
Subroot.AppendChild(todoStatus);
Subroot.AppendChild(UserID);
doc.Save(path);
MessageBox.Show("Selected Record Edited Successfully");
【讨论】:
【参考方案4】: DataTable dataTable = new DataTable();
int count1,count2;
clsInfor.northCON.Open();
clsInfor.dataAdapter = new SqlDataAdapter("SELECT Discontinued, QuantityPerUnit FROM Products", clsInfor.northCON);
dataTable = new DataTable();
clsInfor.dataAdapter.Fill(dataTable);
Excel.Application app = new Excel.Application(); //creating a new application
app.Visible = true;
Excel.Workbook book = app.Workbooks.Add(1); // creating an instance of the workbook
Excel.Worksheet sheet = (Excel.Worksheet)book.Worksheets[1]; // creating an instance of the worksheet
((Excel.Range)sheet.Cells[1, "A"]).Value2 = "Report"; // creating the header of the report
((Excel.Range)sheet.Cells[2, "B"]).Value2 = "Number of products per Cat";//creating the names of the colomns in the excell spreedsheet
((Excel.Range)sheet.Cells[2, "C"]).Value2 = "Number of products that have been discontinued";
((Excel.Range)sheet.Cells[4, "D"]).Value2 = "Tot number of Prod";
for (count1 = 0; count1 < dataTable.Rows.Count; count1++)
for (count2 = 0; count2 < dataTable.Columns.Count; count2++)
sheet.Cells[count1 + 3, count2 + 2] = dataTable.Rows[count1][count2];
sheet.Cells.Columns.AutoFit();
【讨论】:
【参考方案5】:Here 我找到了适合您问题的解决方案。
Crystal Reports 可以使用 ODBC DSN 连接到数据库,您可以从中提取数据和信息用于报告目的。
注意 某些版本的 Crystal Reports 存在一个已知问题 应用程序无法打开和浏览表格和字段的地方 通过 ODBC 连接。在将 Crystal Reports 与 MySQL 一起使用之前, 请确保您已更新到最新版本,包括 任何出色的服务包和修补程序。有关更多信息 此问题,请参阅业务)对象知识库了解更多信息 信息。
按照以下步骤操作:
-
使用数据源 (ODBC) 工具创建 DSN。您可以指定一个完整的数据库,包括用户名和密码,也可以构建一个基本的 DSN 并使用 Crystal Reports 设置用户名和密码。
通过单击起始页上的选项来启动交叉表报告向导。展开Create New Connection 文件夹,然后展开 ODBC (RDO) 文件夹以获取 ODBC 数据源列表。
【讨论】:
以上是关于如何在 Visual Studio 2010 中使用 Crystal Reports 创建报表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2008 或 Visual Studio 2010 中设置 JavaScript 断点
如何在 Visual Studio 2010 中使用 Visual Studio 2008 创建的 DLL?
关于在Visual Studio2010中如何卸载Visual Asixist这个插件?为啥将它卸载后Visual Studio启动后仍然有