记录Aspose.Word 和 NPOI 基本

刚毕业的我。刚入行的我。记录点从工作里学到的知识点。

小白的我有全栈大牛的梦

最近用的比较多的是Aspose.Word 和 NPOI (基于.NET)

NPOI:

1.在单元格内插入图片

IWorkbook book = new HSSFWorkbook();
 //添加一个sheet
ISheet sheet1 = book.CreateSheet("CS");
//定义excel基本的格式
NPOI.SS.UserModel.ICellStyle style = book.CreateCellStyle();
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
tyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
style.Alignment = HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Center;
//开始
IRow row = sheet1.CreateRow(0);
row = sheet1.CreateRow(0);
ICell notescontent = row1.CreateCell(0);
byte[] bytes = System.IO.File.ReadAllBytes("图片地址");
int pictureIdx = book.AddPicture(bytes, PictureType.PNG);
IDrawing patriarch = sheet1.CreateDrawingPatriarch();
var anchor = new HSSFClientAnchor(0, 20, 10, 0, 0, 0, 2, 7);
var pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);

参数的解析: HSSFClientAnchor(int dx1,int dy1,int dx2,int dy2,int col1,int row1,int col2,int row2)

dx1:图片左边相对excel格的位置(x偏移) 范围值为:0~1023;即输100 偏移的位置大概是相对于整个单元格的宽度的100除以1023大概是10分之一

dy1:图片上方相对excel格的位置(y偏移) 范围值为:0~256 原理同上。

dx2:图片右边相对excel格的位置(x偏移) 范围值为:0~1023; 原理同上。

dy2:图片下方相对excel格的位置(y偏移) 范围值为:0~256 原理同上。

col1和row1 :图片左上角的位置,以excel单元格为参考,比喻这两个值为(1,1),那么图片左上角的位置就是excel表(1,1)单元格的右下角的点(A,1)右下角的点。

col2和row2:图片右下角的位置,以excel单元格为参考,比喻这两个值为(2,2),那么图片右下角的位置就是excel表(2,2)单元格的右下角的点(B,2)右下角的点。

更详细参考地址
https://www.cnblogs.com/wei325/p/4748324.html

2.到指定位置填值

row1 = sheet1.CreateRow(2);//第3行
notescontent = row1.CreateCell(2);//第三列
notescontent.SetCellValue("Hello");//填值

这个比较简单明了。要是需要样式的,可以在填值前更改样式

Aspose.Word:

Aspose.Word的用法最多的是移动到指定的书签然后进行操作,一般也无非插入图片和添值,所以这个我也做两块记录

1.到指定位置填值

因为模版是定死的,有些列表可以填多少条信息,所以一般的顺序是
先判断 → 再是否新增行 → 再添值

Aspose.Words.Document doc = new Aspose.Words.Document("word模版地址");
Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);
//拿到所有表格
NodeCollection allTables = doc.GetChildNodes(NodeType.Table, true); 
//移动到模版的指定列表 
Aspose.Words.Tables.Table table = allTables[0] as Aspose.Words.Tables.Table;
//判断个数
if (data.productList.Count > 5)
{
     for (int i = 0; i < (data.productList.Count - 3); i++)
     {
         var roww = table.Rows[3];
         var row = roww.Clone(true);//复制第三行
         table.Rows.Insert(3 + i, row);//将复制的行插入当前行的上方
     }
 }
 //循环添值
foreach (var item in data.productList)
{
    builder.MoveToCell(0, 3 + j, 0, 0);
    builder.Write(item.productName));
    j++;
}
//MoveToCell()的用法大家可以百度,大概意思就是第几个列表,第几行,第几列

2.插入图片

其实插入图片跟插入文字是一个道理,考虑的顺序跟上述一样。
主要的是图片的转换和大小的把控,因为一般为什么有模本,就是因为有些客户的需求是定制的,所以会不一样。那么废话不多说直接贴代码

#region 生成存放图片表格

                foreach (var item in data.imglist)
                {
                    var index = data.imglist.IndexOf(item);
                    var countNum = item.children.Count();
                    if (countNum > 0)
                    {
                        if (countNum % 2 != 0)
                        {
                            countNum += 1;
                        }
                        countNum = countNum / 2;

                        if (index != 0)
                        {
                            var Rows0 = table.Rows[0];
                            var productRow = Rows0.Clone(true);
                            table.Rows.Insert(rowIndex + 1, productRow);
                            rowIndex = rowIndex + 1;
                            for (int i = rowIndex; i < (rowIndex + countNum); i++)
                            {
                                var Rows1 = table.Rows[1];
                                var ImgRow = Rows1.Clone(true);
                                var Rows2 = table.Rows[2];
                                var tagRow = Rows2.Clone(true);
                                table.Rows.Insert(i + (i - 1), ImgRow);
                                table.Rows.Insert(i + i, tagRow);
                            }

                            rowIndex = rowIndex + (countNum * 2);
                        }
                        else
                        {
                            countNum = countNum - 1;
                            for (int i = rowIndex; i < (rowIndex + countNum); i++)
                            {
                                var Rows1 = table.Rows[1];
                                var ImgRow = Rows1.Clone(true);
                                var Rows2 = table.Rows[2];
                                var tagRow = Rows2.Clone(true);
                                table.Rows.Insert(i + (i - 1), ImgRow);
                                table.Rows.Insert(i + i, tagRow);
                            }
                            rowIndex = rowIndex + (countNum * 2);
                        }
                    }
                }
                #endregion
//插入图片                
WebRequest request = WebRequest.Create(item.children[i + i].defaultimg);
WebResponse response = request.GetResponse();
Stream s = response.GetResponseStream();
byte[] imgdata = new byte[1024];
int length = 0;
MemoryStream imgms = new MemoryStream();
while ((length = s.Read(imgdata, 0, imgdata.Length)) > 0)
{
imgms.Write(imgdata, 0, length);
}
imgms.Seek(0, SeekOrigin.Begin);
System.Drawing.Image image = System.Drawing.Image.FromStream(imgms);
var h = image.Height * (250.5 / image.Width);//为了不失帧转换高度
builder.MoveToCell(4, rowIndex, 1, 0);
builder.InsertImage(imgms, 250.5, h);//插入图片

其实都是简单的。都是一些基本的操作,代码并不是特别难理解
我的是以一行两格图片。如果是多个的,生成表格的地方需要更改下

总结

1.第一次写博客,这次只是记录点我工作中用到的,也许哪些不对,请指出,共同进步
2.其实这些教程其他大牛也写过,网上一大堆,所以如果看不懂或者永不会的可以多多百度(反正我毕业后用的最多的就是度娘了)
3.正版的Aspose.Word 生成的文档是有水印的,所以大家的懂的,支持正版,谢谢
……欢迎留言交流……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值