小弟是刚学习C#没多久,这两天被一个EXCEL问题搞的晕头转向的,希望哪个高手来指点迷津!
程序很小,我就是把那一个ACESS数据库用水晶报表显示出来,但显示的内容跟数据库的结构不一样,需要一定的修改,所以我就用dataread把ACESS里面需要的数据读取出来,然后按照显示的要求把数据写到一个EXCEL临时数据表里,然后用水晶报表显示EXCEL临时的数据。程序中我用一个BUTTON触发显示水晶报表,第一次显示的时候都可以,但当我关闭那个水晶报表,再次点击那个BUTTON按钮后,就错误提示那个EXCEL数据库就没法读取,只有关闭整个窗体重新运行才可以!(我之前以为是我EXCEL进程没清除干净,但后面发现应该不是这个问题,朋友说可能是我把水晶报表的数据库链接到了那个EXCEL文件,所以就被锁定了,但不在知道如何解决)。这个问题我搞了两天了,实在没办法,像各位高手求救了~!!这是我第一次发帖,大家帮帮忙啊!!!
问题2:怎么判定EXCEL的cell为空,我用cells【i,j】!=null,cell【i,j】==“”,cell【i,j】.ToString().Length!=0;好像都不行
问题3:我水晶报表里读取EXCEL里面的数据时候,为什么里面中文读不出来(那一栏为空),而数字都可以显示,而我看水晶报表相应栏目里面(【F1】--sheet1_.F1(数字)),那一栏它显示是数字!!
关键是第一个问题~!!
一下是我的button触发的代码:
private DateTime Dt;
private Excel.Workbook oBook;
private DateTime DtAdd;
private Object missing;
private int MonthDays;
private Excel.Application oExcel;
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
private void button1_Click(object sender, EventArgs e)
{
Dt = this.dateTimePicker1.Value;
MonthDays = System.DateTime.DaysInMonth(Dt.Year, Dt.Month);
DtAdd = Dt.AddMonths(1);
OleDbDataReader reader;
string strCommand = "SELECT 日期时间,场面气压 FROM 月总簿要素 where 日期时间 BETWEEN '" + Dt.ToString("yyyy-MM-dd") + "' And '" + DtAdd.ToString("yyyy-MM-dd") + "'";
if (conConnection.State == ConnectionState.Closed)
{
this.conConnection.Open();// 打开数据连接
}
OleDbCommand cmd = new OleDbCommand(strCommand, conConnection);
reader = cmd.ExecuteReader();//获得数据集 -------------获得ACESS中的数据
oExcel = new Microsoft.Office.Interop.Excel.Application();
missing = System.Reflection.Missing.Value;
oExcel.Application.Workbooks.Open(@"C:\DataImitil.xls", missing, false, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote, missing, true, missing, true, missing, missing, missing, missing, missing, missing);---第二次触发button,这行提示错误,说无法打开DataImitil.xls,被锁定
oBook = oExcel.Workbooks[1];
Excel.Worksheet oWorksheet = (Excel.Worksheet)oExcel.Worksheets[1];
oWorksheet.Cells.Clear();
string sum; //把reader的数据,按显示的格式填充临时数据库表 EXCEL;
if (reader.Read())
{
do
{
DateTime dt;
dt = Convert.ToDateTime(reader["日期时间"]);
int Row = Convert.ToInt32(dt.Day);
if (Row <= 10)
{
Row = Row + 1; }
else if (Row > 10 && Row <= 20)
{
Row = Row + 3;
}
else if (Row > 20)
{
Row = Row + 5;
}
int Col = Convert.ToInt32(dt.Hour) + 2; oWorksheet.Cells[Row, Col] = Convert.ToDouble(reader["场面气压"]).ToString("n1");
} while (reader.Read());
}
//写完,保存
try
{
//oBook .Unprotect("");
oBook.Save();
oExcel.Quit();
}
catch (IOException ex)
{
MessageBox.Show("错误:{0}", ex.Message);
}
//--清除系统的EXCEL进程
Form_Crystal newForm = new Form_Crystal();
newForm.Show(); ------------------,并显示水晶报表!
IntPtr t = new IntPtr(oExcel.Hwnd);
int m = 0;
GetWindowThreadProcessId(t, out m);
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(m);
p.Kill();
程序很小,我就是把那一个ACESS数据库用水晶报表显示出来,但显示的内容跟数据库的结构不一样,需要一定的修改,所以我就用dataread把ACESS里面需要的数据读取出来,然后按照显示的要求把数据写到一个EXCEL临时数据表里,然后用水晶报表显示EXCEL临时的数据。程序中我用一个BUTTON触发显示水晶报表,第一次显示的时候都可以,但当我关闭那个水晶报表,再次点击那个BUTTON按钮后,就错误提示那个EXCEL数据库就没法读取,只有关闭整个窗体重新运行才可以!(我之前以为是我EXCEL进程没清除干净,但后面发现应该不是这个问题,朋友说可能是我把水晶报表的数据库链接到了那个EXCEL文件,所以就被锁定了,但不在知道如何解决)。这个问题我搞了两天了,实在没办法,像各位高手求救了~!!这是我第一次发帖,大家帮帮忙啊!!!
问题2:怎么判定EXCEL的cell为空,我用cells【i,j】!=null,cell【i,j】==“”,cell【i,j】.ToString().Length!=0;好像都不行
问题3:我水晶报表里读取EXCEL里面的数据时候,为什么里面中文读不出来(那一栏为空),而数字都可以显示,而我看水晶报表相应栏目里面(【F1】--sheet1_.F1(数字)),那一栏它显示是数字!!
关键是第一个问题~!!
一下是我的button触发的代码:
private DateTime Dt;
private Excel.Workbook oBook;
private DateTime DtAdd;
private Object missing;
private int MonthDays;
private Excel.Application oExcel;
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
private void button1_Click(object sender, EventArgs e)
{
Dt = this.dateTimePicker1.Value;
MonthDays = System.DateTime.DaysInMonth(Dt.Year, Dt.Month);
DtAdd = Dt.AddMonths(1);
OleDbDataReader reader;
string strCommand = "SELECT 日期时间,场面气压 FROM 月总簿要素 where 日期时间 BETWEEN '" + Dt.ToString("yyyy-MM-dd") + "' And '" + DtAdd.ToString("yyyy-MM-dd") + "'";
if (conConnection.State == ConnectionState.Closed)
{
this.conConnection.Open();// 打开数据连接
}
OleDbCommand cmd = new OleDbCommand(strCommand, conConnection);
reader = cmd.ExecuteReader();//获得数据集 -------------获得ACESS中的数据
oExcel = new Microsoft.Office.Interop.Excel.Application();
missing = System.Reflection.Missing.Value;
oExcel.Application.Workbooks.Open(@"C:\DataImitil.xls", missing, false, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote, missing, true, missing, true, missing, missing, missing, missing, missing, missing);---第二次触发button,这行提示错误,说无法打开DataImitil.xls,被锁定
oBook = oExcel.Workbooks[1];
Excel.Worksheet oWorksheet = (Excel.Worksheet)oExcel.Worksheets[1];
oWorksheet.Cells.Clear();
string sum; //把reader的数据,按显示的格式填充临时数据库表 EXCEL;
if (reader.Read())
{
do
{
DateTime dt;
dt = Convert.ToDateTime(reader["日期时间"]);
int Row = Convert.ToInt32(dt.Day);
if (Row <= 10)
{
Row = Row + 1; }
else if (Row > 10 && Row <= 20)
{
Row = Row + 3;
}
else if (Row > 20)
{
Row = Row + 5;
}
int Col = Convert.ToInt32(dt.Hour) + 2; oWorksheet.Cells[Row, Col] = Convert.ToDouble(reader["场面气压"]).ToString("n1");
} while (reader.Read());
}
//写完,保存
try
{
//oBook .Unprotect("");
oBook.Save();
oExcel.Quit();
}
catch (IOException ex)
{
MessageBox.Show("错误:{0}", ex.Message);
}
//--清除系统的EXCEL进程
Form_Crystal newForm = new Form_Crystal();
newForm.Show(); ------------------,并显示水晶报表!
IntPtr t = new IntPtr(oExcel.Hwnd);
int m = 0;
GetWindowThreadProcessId(t, out m);
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(m);
p.Kill();
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货