刚毕业的我。刚入行的我。记录点从工作里学到的知识点。
小白的我有全栈大牛的梦
最近用的比较多的是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 生成的文档是有水印的,所以大家的懂的,支持正版,谢谢
……欢迎留言交流……