如何把数据库中的数据读取到word中

xiaoyanwei2000 2009-07-24 05:46:14
word文档是这样的:
。。。。。。。。。。。。。。。
。。。。。。。。。。。姓名
。。。。。。。。。。。单位
。。。。。。。。。。。工种
。。。。。。。。。。。年月日
这个word文档中还有许多表格,
问题1:
红色的内容和表格中的一些内容是要从数据库中动态填写的,如何实现
问题2:
此word文档点击按钮直接生成,生成的word文档不能修改,当然不是生成后设置保护,要在代码中实现
...全文
302 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdhlowforever 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liumj2001 的回复:]
用标签。
C# code


///
/// 用指定字符串替换书签内容,这种方法需要便利每一个对像效率低,放弃。
///
///书签集合对象
///书签名
///替换字符串
private void replace(Word.Bookmarks bms, valueinfo target)
{
object missing = System.Reflection.Missing.Value;

foreach (Word.Bookmark bm in bms)
{
//判断变量类型
if (target.strval.GetType().ToString() != "System.String")
{
if (bm.Name.Equals(target.strname))
{
bm.Select();
//如果表上部有合并单元需要加上合并单元行数,第一个值是行第二个是列
inputtable(bm.Range.Tables[1], (DataTable)target.strval,bm.Range.Rows.Height, 7, 3, 1);



}

}
else
{
if (bm.Name.Equals(target.strname))
{
//System.Windows.Forms.MessageBox.Show( bm.Name + "OK");
bm.Select();
bm.Range.Text = (string)target.strval;
break;
}
}
}
}
///
/// 将数据添入指定WORD表区域,注意列数量保持和WORD一样不然出错。
///
///标签位置表对像
///要添加的数据源
///原行数量
///行高
///开始添加的行
///开始添加的列
private void inputtable(Word.Table wordtab,DataTable dts,float tablehei,int rowscont, int x,int y)
{
//Word.Table newTable = bm.Range.Tables[1];
//bm.Range.Tables[1].Rows.Height;
//粘贴
//bm.Range.Paste();
//添加一行
if (dts.Rows.Count > 0)
{
object ff = 1;
//得出控制高度
tablehei = tablehei * rowscont;
//bm.Application.ActiveWindow.View.ShowFieldCodes = true;
float rowhei = 0;

if (dts.Rows.Count > rowscont)
{
ff = dts.Rows.Count - rowscont;
App.Selection.InsertRows(ref ff);
//获得总高度,以保持高度不变
tablehei = App.Selection.Cells.Height * rowscont;
rowhei = tablehei / dts.Rows.Count;
}
for (int b = 0; b < dts.Columns.Count; b++)
{
for (int i = 0; i < dts.Rows.Count; i++)
{
if (rowhei != 0)
{
wordtab.Cell(i + x, b + y).Height = rowhei;

}
wordtab.Cell(i + x, b + y).Range.Text = dts.Rows[i][b].ToString();
}
}
}

}
///
/// 返回指定控件的Text值
///
///控件名
///返回控件的Text值
private String getControlText(String ControlName)
{

foreach (Control objCtl in this.Panel1.Controls)
{
if (objCtl.ToString() == "System.Web.UI.WebControls.TextBox")
{
TextBox ff = (TextBox)objCtl;
if (ff.ID == ControlName)
{
return ff.Text;
}
}
}

return "";
}
protected void Button2_Click(object sender, EventArgs e)
{
HttpResponse resp;
resp = Page.Response;
resp.ContentType = "application/msword";

resp.WriteFile(Server.MapPath(".") + "\\doc\\2.doc");
}
protected void Button3_Click(object sender, EventArgs e)
{
DataRow dr = clsglo.gtb.NewRow();
dr["ID"] = "test";
dr["Sex"] = "0";
clsglo.gtb.Rows.Add(dr);
GridView1.DataSource = clsglo.gtb;
GridView1.DataBind();
}


private void inputdata(Word.Bookmarks bms,string strmd5id)
{
string strfidsql;//得到所有字段
string strdatasql;//得到数据
string strbmval;//标签名
string strtab;//各子表查询Sql
DataSet ds = new DataSet();
DataSet dstab = new DataSet();//用来更新子表

//strfidsql = "SELECT value as dname,objname as vname FROM ::fn_listextendedproperty(NULL,'user','dbo','table','gstab','column',default)";
//SqlDataAdapter sdafid=new SqlDataAdapter(strfidsql,clsglo.con);
//sdafid.Fill(ds, "fid");
strdatasql = "select top 1 * from gstab where gsnum='" + strmd5id + "'";
SqlDataAdapter sdafid = new SqlDataAdapter(strdatasql, clsglo.con);
sdafid.Fill(ds, "val");
//循环所有公司表字段
object missing = System.Reflection.Missing.Value;

foreach (Word.Bookmark bm in bms)
{
if (bm.Name.IndexOf("00") > 0)
{
strbmval = bm.Name.Remove(bm.Name.IndexOf("00"));
}
else
{
strbmval = bm.Name;
}
//try
//{
bm.Select();
if (ds.Tables["val"].Columns.Contains(strbmval))//列是否存在
{
if (ds.Tables["val"].Rows[0][strbmval] != null)
{
bm.Range.Text = ds.Tables["val"].Rows[0][strbmval].ToString();
}
else
{
bm.Range.Text = "";
}
}
else
{
//非常规的WORD标记处理
switch (strbmval)
{
case "dbjltab":
{
strtab = "select fddbrjlqznyvc,fddbrjlqznyvc,fddbrjlgzzwvc from dbjltab where gsnum='" + strmd5id + "'";
sdafid = new SqlDataAdapter(strtab, clsglo.con);
dstab = new DataSet();
sdafid.Fill(dstab, "tab");
//如果表上部有合并单元需要加上合并单元行数,第一个值是行第二个是列
//bm.Select();
inputtable(bm.Range.Tables[1], dstab.Tables["tab"],bm.Range.Rows.Height , 6, 9, 2);
break;
}
case "dshtab":
break;
case "dwgdtab":
break;
case "gdrhztab":
break;
case "gdrtab":
break;
case "zdjftab":
break;
default:
{
break;
}

}
}
//}
//catch//没有找到字段名那就有可能是表
//{


//}


}

//for (int i = 0; i < ds.Tables["fid"].Rows.Count; i++)
//{
// if (ds.Tables["val"].Rows[0][ds.Tables["fid"].Rows[i]["vname"].ToString()] != null)
// {

// }
//}


}
///
/// 插入公司信息表,所有非DATATABLE类型都将插入到公司信息
///
/// 直接使用添加的变量集合
///
private string intogs()
{
try
{
string strfid = "";//插入的列字符串
string strval = "";//插入的值字符串
string strintosql = "";//最终生成的插入基本公司信息的SQL
SqlCommand scdinto = new SqlCommand();
//循环所有变量生成两个字符串
foreach (valueinfo s in clsglo.strarr)
{
//仅处理普通变量不处理表格型
if (s.strval.GetType().ToString() == "System.String")
{
strfid += s.strname + ",";
//检测是否需要加引号
if (s.inttype == 0)
{

strval += "'" + (string)s.strval + "',";
}
else
{
//不加引号
strval += (string)s.strval + ",";
}
}

}
//去掉最后面的对号
strfid = strfid.Remove(strfid.Length - 1, 1);
strval = strval.Remove(strval.Length - 1, 1);
//生成插入公司表sql
strintosql = "INSERT INTO gstab (" + strfid + ") VALUES (" + strval + ")";
scdinto.Connection = clsglo.con;
scdinto.CommandText = strintosql;
scdinto.ExecuteNonQuery();
return "";
}
catch (Exception ex)
{
return ex.ToString();
}
}
protected void Button4_Click(object sender, EventArgs e)
{

StartConvertPDF(Server.MapPath(".") + "\\doc\\2.doc", Server.MapPath(".") + "\\pdf\\45.pdf");
hl1.NavigateUrl = "pdf/45.pdf";

}
protected void Button5_Click(object sender, EventArgs e)
{
Response.Write("window.open('pdf/45.pdf','_blank');");

//HttpResponse resp;
//resp = Page.Response;
//resp.ContentType = "application/pdf";

//resp.WriteFile(Server.MapPath(".") + "\\pdf\\45.pdf");
}
}
[/Quote]

看的头晕..不过相信有用!
liumj2001 2009-07-29
  • 打赏
  • 举报
回复
恩。楼主满意不?
marey_marey111 2009-07-28
  • 打赏
  • 举报
回复
取出数据。。用Word的书签。。然后一个一个的插入!!这种代码网上很多。。
sl2161 2009-07-28
  • 打赏
  • 举报
回复
利用word的书签功能
goonfighting 2009-07-28
  • 打赏
  • 举报
回复
2L搞这么一堆代码出来。
yijianxiangde100 2009-07-28
  • 打赏
  • 举报
回复
2楼强淫。
麻子Mozart 2009-07-28
  • 打赏
  • 举报
回复
up
meheartfly 2009-07-27
  • 打赏
  • 举报
回复
第一个问题好解决,用标签,可以参考2楼的代码,至于数据库里面的数据,取出来就是了,没什么好说的
xiaoyanwei2000 2009-07-27
  • 打赏
  • 举报
回复
写顶的都是没诚意的,都没分~~
meheartfly 2009-07-27
  • 打赏
  • 举报
回复
我顶
jdbcodbc 2009-07-27
  • 打赏
  • 举报
回复
up
红街咖啡 2009-07-27
  • 打赏
  • 举报
回复
看看来的。我很老实的。帮你顶一下。
mb_1985 2009-07-25
  • 打赏
  • 举报
回复
水晶报表,直接导出word,方便的让人感慨...
zagj11 2009-07-24
  • 打赏
  • 举报
回复
有个打印控件。可以直接帮你把文件转换为word
liumj2001 2009-07-24
  • 打赏
  • 举报
回复
代码你看看,不会的,再提问。
liumj2001 2009-07-24
  • 打赏
  • 举报
回复
用标签。



/// <summary>
/// 用指定字符串替换书签内容,这种方法需要便利每一个对像效率低,放弃。
/// </summary>
/// <param name="bms">书签集合对象</param>
/// <param name="bmName">书签名</param>
/// <param name="tag">替换字符串</param>
private void replace(Word.Bookmarks bms, valueinfo target)
{
object missing = System.Reflection.Missing.Value;

foreach (Word.Bookmark bm in bms)
{
//判断变量类型
if (target.strval.GetType().ToString() != "System.String")
{
if (bm.Name.Equals(target.strname))
{
bm.Select();
//如果表上部有合并单元需要加上合并单元行数,第一个值是行第二个是列
inputtable(bm.Range.Tables[1], (DataTable)target.strval,bm.Range.Rows.Height, 7, 3, 1);



}

}
else
{
if (bm.Name.Equals(target.strname))
{
//System.Windows.Forms.MessageBox.Show( bm.Name + "OK");
bm.Select();
bm.Range.Text = (string)target.strval;
break;
}
}
}
}
/// <summary>
/// 将数据添入指定WORD表区域,注意列数量保持和WORD一样不然出错。
/// </summary>
/// <param name="wordtab">标签位置表对像</param>
/// <param name="dts">要添加的数据源</param>
/// <param name="rowscont">原行数量</param>
/// <param name="tablehei">行高</param>
/// <param name="x">开始添加的行</param>
/// <param name="y">开始添加的列</param>
private void inputtable(Word.Table wordtab,DataTable dts,float tablehei,int rowscont, int x,int y)
{
//Word.Table newTable = bm.Range.Tables[1];
//bm.Range.Tables[1].Rows.Height;
//粘贴
//bm.Range.Paste();
//添加一行
if (dts.Rows.Count > 0)
{
object ff = 1;
//得出控制高度
tablehei = tablehei * rowscont;
//bm.Application.ActiveWindow.View.ShowFieldCodes = true;
float rowhei = 0;

if (dts.Rows.Count > rowscont)
{
ff = dts.Rows.Count - rowscont;
App.Selection.InsertRows(ref ff);
//获得总高度,以保持高度不变
tablehei = App.Selection.Cells.Height * rowscont;
rowhei = tablehei / dts.Rows.Count;
}
for (int b = 0; b < dts.Columns.Count; b++)
{
for (int i = 0; i < dts.Rows.Count; i++)
{
if (rowhei != 0)
{
wordtab.Cell(i + x, b + y).Height = rowhei;

}
wordtab.Cell(i + x, b + y).Range.Text = dts.Rows[i][b].ToString();
}
}
}

}
/// <summary>
/// 返回指定控件的Text值
/// </summary>
/// <param name="ControlName">控件名</param>
/// <returns>返回控件的Text值</returns>
private String getControlText(String ControlName)
{

foreach (Control objCtl in this.Panel1.Controls)
{
if (objCtl.ToString() == "System.Web.UI.WebControls.TextBox")
{
TextBox ff = (TextBox)objCtl;
if (ff.ID == ControlName)
{
return ff.Text;
}
}
}

return "";
}
protected void Button2_Click(object sender, EventArgs e)
{
HttpResponse resp;
resp = Page.Response;
resp.ContentType = "application/msword";

resp.WriteFile(Server.MapPath(".") + "\\doc\\2.doc");
}
protected void Button3_Click(object sender, EventArgs e)
{
DataRow dr = clsglo.gtb.NewRow();
dr["ID"] = "test";
dr["Sex"] = "0";
clsglo.gtb.Rows.Add(dr);
GridView1.DataSource = clsglo.gtb;
GridView1.DataBind();
}


private void inputdata(Word.Bookmarks bms,string strmd5id)
{
string strfidsql;//得到所有字段
string strdatasql;//得到数据
string strbmval;//标签名
string strtab;//各子表查询Sql
DataSet ds = new DataSet();
DataSet dstab = new DataSet();//用来更新子表

//strfidsql = "SELECT value as dname,objname as vname FROM ::fn_listextendedproperty(NULL,'user','dbo','table','gstab','column',default)";
//SqlDataAdapter sdafid=new SqlDataAdapter(strfidsql,clsglo.con);
//sdafid.Fill(ds, "fid");
strdatasql = "select top 1 * from gstab where gsnum='" + strmd5id + "'";
SqlDataAdapter sdafid = new SqlDataAdapter(strdatasql, clsglo.con);
sdafid.Fill(ds, "val");
//循环所有公司表字段
object missing = System.Reflection.Missing.Value;

foreach (Word.Bookmark bm in bms)
{
if (bm.Name.IndexOf("00") > 0)
{
strbmval = bm.Name.Remove(bm.Name.IndexOf("00"));
}
else
{
strbmval = bm.Name;
}
//try
//{
bm.Select();
if (ds.Tables["val"].Columns.Contains(strbmval))//列是否存在
{
if (ds.Tables["val"].Rows[0][strbmval] != null)
{
bm.Range.Text = ds.Tables["val"].Rows[0][strbmval].ToString();
}
else
{
bm.Range.Text = "";
}
}
else
{
//非常规的WORD标记处理
switch (strbmval)
{
case "dbjltab":
{
strtab = "select fddbrjlqznyvc,fddbrjlqznyvc,fddbrjlgzzwvc from dbjltab where gsnum='" + strmd5id + "'";
sdafid = new SqlDataAdapter(strtab, clsglo.con);
dstab = new DataSet();
sdafid.Fill(dstab, "tab");
//如果表上部有合并单元需要加上合并单元行数,第一个值是行第二个是列
//bm.Select();
inputtable(bm.Range.Tables[1], dstab.Tables["tab"],bm.Range.Rows.Height , 6, 9, 2);
break;
}
case "dshtab":
break;
case "dwgdtab":
break;
case "gdrhztab":
break;
case "gdrtab":
break;
case "zdjftab":
break;
default:
{
break;
}

}
}
//}
//catch//没有找到字段名那就有可能是表
//{


//}


}

//for (int i = 0; i < ds.Tables["fid"].Rows.Count; i++)
//{
// if (ds.Tables["val"].Rows[0][ds.Tables["fid"].Rows[i]["vname"].ToString()] != null)
// {

// }
//}


}
/// <summary>
/// 插入公司信息表,所有非DATATABLE类型都将插入到公司信息
/// </summary>
/// 直接使用添加的变量集合
/// <returns></returns>
private string intogs()
{
try
{
string strfid = "";//插入的列字符串
string strval = "";//插入的值字符串
string strintosql = "";//最终生成的插入基本公司信息的SQL
SqlCommand scdinto = new SqlCommand();
//循环所有变量生成两个字符串
foreach (valueinfo s in clsglo.strarr)
{
//仅处理普通变量不处理表格型
if (s.strval.GetType().ToString() == "System.String")
{
strfid += s.strname + ",";
//检测是否需要加引号
if (s.inttype == 0)
{

strval += "'" + (string)s.strval + "',";
}
else
{
//不加引号
strval += (string)s.strval + ",";
}
}

}
//去掉最后面的对号
strfid = strfid.Remove(strfid.Length - 1, 1);
strval = strval.Remove(strval.Length - 1, 1);
//生成插入公司表sql
strintosql = "INSERT INTO gstab (" + strfid + ") VALUES (" + strval + ")";
scdinto.Connection = clsglo.con;
scdinto.CommandText = strintosql;
scdinto.ExecuteNonQuery();
return "";
}
catch (Exception ex)
{
return ex.ToString();
}
}
protected void Button4_Click(object sender, EventArgs e)
{

StartConvertPDF(Server.MapPath(".") + "\\doc\\2.doc", Server.MapPath(".") + "\\pdf\\45.pdf");
hl1.NavigateUrl = "pdf/45.pdf";

}
protected void Button5_Click(object sender, EventArgs e)
{
Response.Write("<script>window.open('pdf/45.pdf','_blank');</script>");

//HttpResponse resp;
//resp = Page.Response;
//resp.ContentType = "application/pdf";

//resp.WriteFile(Server.MapPath(".") + "\\pdf\\45.pdf");
}
}
xiaoyanwei2000 2009-07-24
  • 打赏
  • 举报
回复
是不是要用到第三方的控件?还是现有的类库就可以实现?freetext支不支持cs程序
给点代码,提供点思路,提供第三方软件都行

110,502

社区成员

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

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

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