有时候,我们需要从asp页面导出用户需要的一些表单。在网上最常见的是gridview导出到word,但gridview有很大的局限性就是样式不好设计。还有其他的一些方法能导出在asp中已经设计好的table。而我的页面由于数据不固定,table是由后台动态生成的,所以很难导出。查了很多资料,发现Aspose.Words挺好用的,虽然不是真正意义上从asp页面导出(你可以直接从数据库读取写入页面的数据,把它写入到单元格,然后画到word中),但能完美的"导出"了我要的表单。下面给大家一个我做的demo。
由于数据需要一条条的插入,所以先把插入单元格的代码写入一个类。(前提是先引入Aspose.Words.dll)
public class InsertCells
{
/// <summary>
/// 插入一个包含内容的单元格
/// </summary>
/// <param name="builder">操作对象</param>
/// <param name="Str">写入的内容</param>
/// <param name="width">单元格的宽度</param>
public void Insert(DocumentBuilder builder, string Str, int width)
{
//设置表格行高度
builder.RowFormat.Height = 20;
//插入Table单元格
builder.InsertCell();
//Table单元格边框线样式
builder.CellFormat.Borders.LineStyle = LineStyle.Hairline;
builder.CellFormat.Borders.Color = System.Drawing.Color.White;
//设置单元格宽度
builder.CellFormat.Width = width;
//此单元格中内容垂直对齐方式
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
builder.CellFormat.HorizontalMerge = Aspose.Words.Tables.CellMerge.None;
builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;
//此单元格中内容水平对齐方式
builder.ParagraphFormat.Alignment = ParagraphAlignment.Left;
//字体大小
builder.Font.Size = 12;
//是否加粗
builder.Bold = false;
//向此单元格中添加内容
builder.Write(Str);
}
}
然后写一个按钮点击事件来“导出”数据到word。
/// <summary>
/// 导出word文档
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btn_word_Click(object sender, EventArgs e)
{
//new一个类的对象
InsertCells insertcell = new InsertCells();
//创建word操作对象
Aspose.Words.Document doc = new Aspose.Words.Document();
DocumentBuilder builder = new DocumentBuilder(doc);
//清除设置
builder.PageSetup.ClearFormatting();
//开始画Table
builder.StartTable();
//使整个表格在页面居中
builder.RowFormat.Alignment = Aspose.Words.Tables.RowAlignment.Center;
string cont = string.Empty;
//定义word的标题
string title = "导出的表格" + "(@@@)";
//标题居中
builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
//字体不加粗
builder.Bold = false;
//字体大小
builder.Font.Size = 16;
//将标题写入word
builder.Writeln(title);
//写一个空行
builder.Writeln("");
string name = "我是谁:??";
//插入一个单元格
insertcell.Insert(builder, name, 100);
string job = "不知道:??";
insertcell.Insert(builder, job, 150);
string time = "调查时间:????-????";
insertcell.Insert(builder, time, 290);
//行结束
builder.EndRow();
//插入空的单元格
insertcell.Insert(builder, "", 540);
builder.EndRow();
//用循环插入问题行
for (int i = 0; i < 5; i++)
{
cont = (i + 1) + ". " + "我是第" + (i + 1) + "个问题";
insertcell.Insert(builder, cont, 540);
builder.EndRow();
//用循环插入每个问题的答案,因为答案为双列,用判断语句排一下
for (int j = 0; j < 3; j++)
{
//奇数且不是最后一个答案,插入包含此答案的单元格,不换行
if (j % 2 == 0 && j < 2)
{
cont = Convert.ToChar(j + 97) + ". " + "答案 " + Convert.ToChar(j + 97);
insertcell.Insert(builder, cont, 270);
}
//奇数且是最后一个答案,插入包含此答案的单元格,再插入一个空的单元格,换行
else if (j % 2 == 0 && j == 2)
{
cont = Convert.ToChar(j + 97) + ". " + "答案 " + Convert.ToChar(j + 97);
insertcell.Insert(builder, cont, 270);
insertcell.Insert(builder, "", 270);
//Table行结束
builder.EndRow();
}
//偶数答案,插入包含此答案的单元格,换行
else
{
cont = Convert.ToChar(j + 97) + ". " + "答案 " + Convert.ToChar(j + 97);
insertcell.Insert(builder, cont, 270);
builder.EndRow();
}
}
//每个问题与下一个问题间插入一个空行单元格
insertcell.Insert(builder, "", 540);
builder.EndRow();
}
//Table表结束
builder.EndTable();
string filename = "问题调查表.doc";
//以下载Word的形式打开Wrod
SaveOptions options = SaveOptions.CreateSaveOptions(SaveFormat.Doc);
doc.Save(Response, filename, ContentDisposition.Attachment, options);
}
OK,作为初学者,写的东西可能很浅,只希望能给其他的初学者一些帮助。大神莫吐槽。