asp.net 写 Excel第一列的单元格 每每3个合并成一个单元格 如这张图上的 红线框住的部分该怎么合并
如果是死的內容,就每三個去合併,如果是活得,可以寫個循環吧,我也是新手,提供個意見而已
很高兴,你能为我提供意见,我还在找解决方案
@Kiss丿残阳: 还没解决吗?你是用NPOI做的吗?我前几天刚做了几个报表,用NPOI做的,你把你的问题说详细点,我帮你想想
@潘雪婷: 是用npoi ,excel中的第一列 每每3个单元格,合并为1个单元格,如图被红线框起来的
@Kiss丿残阳: 可以附上你赋值的代码吗?
@潘雪婷: 这个就是我导出用的代码但是那个合并 不知道怎么弄
public static MemoryStream WriteListToExcel(XDictArray list,String strdate) { MemoryStream ms = new MemoryStream(); IWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet(); // IRow TitleRow = sheet.CreateRow(0); /******************写入标题行,合并居中*********************/ //合并单元格 ICellStyle headerRowStyle = workbook.CreateCellStyle(); headerRowStyle.Alignment = HorizontalAlignment.Center;//水平居中 headerRowStyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中 IFont headerfont = workbook.CreateFont(); headerfont.FontHeightInPoints = 12;//大小 headerfont.Boldweight = 700; headerRowStyle.SetFont(headerfont); headerRowStyle.BorderDiagonalLineStyle = BorderStyle.Thin; headerRowStyle.BorderBottom = BorderStyle.Thin;// (BorderStyle)CellBorderType.THIN; headerRowStyle.BorderLeft = BorderStyle.Thin; headerRowStyle.BorderRight = BorderStyle.Thin; headerRowStyle.BorderTop = BorderStyle.Thin; //头样式 ICellStyle headerRowStyle2 = workbook.CreateCellStyle(); headerRowStyle2.Alignment = HorizontalAlignment.Center;//水平居中 headerRowStyle2.VerticalAlignment = VerticalAlignment.Center;//垂直居中 headerRowStyle2.BorderBottom = BorderStyle.Thin;// (BorderStyle)CellBorderType.THIN; headerRowStyle2.BorderLeft = BorderStyle.Thin; headerRowStyle2.BorderRight = BorderStyle.Thin; headerRowStyle2.BorderTop = BorderStyle.Thin; //内容样式 ICellStyle cellstyle = workbook.CreateCellStyle(); cellstyle.Alignment = HorizontalAlignment.Center;//水平居中 cellstyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中 //cellstyle.BorderBottom = BorderStyle.Thin;//边框 //cellstyle.BorderLeft = BorderStyle.Thin; //cellstyle.BorderRight = BorderStyle.Thin; //cellstyle.BorderTop = BorderStyle.Thin; IFont cellstylefont = workbook.CreateFont(); cellstylefont.FontHeightInPoints = 10;//大小 cellstylefont.Boldweight = 700; cellstyle.SetFont(cellstylefont); //-------------- IRow headerRow = sheet.CreateRow(0); headerRow.HeightInPoints = 20; headerRow.Height = 600; // ------------- //内容样式 ICellStyle bottomrow = workbook.CreateCellStyle(); bottomrow.Alignment = HorizontalAlignment.Center;//水平居中 bottomrow.VerticalAlignment = VerticalAlignment.Center;//垂直居中 bottomrow.BorderBottom = BorderStyle.Thin;//边框 //------------------ //第一列 NPOI.SS.UserModel.IRow row = sheet.CreateRow(0); row.CreateCell(0).SetCellValue("案件类型"); row.CreateCell(1).SetCellValue("参数"); row.CreateCell(2).SetCellValue("总数"); row.CreateCell(3).SetCellValue("套数"); row.CreateCell(4).SetCellValue("建筑面积(㎡)"); //设置列的宽度 sheet.SetColumnWidth(0, 20 * 256); sheet.SetColumnWidth(1, 22 * 256); sheet.SetColumnWidth(2, 15 * 256); sheet.SetColumnWidth(3, 15 * 256); sheet.SetColumnWidth(4, 20 * 256); SetRowStyle(row, headerRowStyle, 0, 5);//样式 //// 第二列 //NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(1); //row2.CreateCell(0).SetCellValue("第二列第一行"); int rowIndex = 1; int Szs = 0; //总计宗数 int Sts = 0; //总计套数 decimal Sjzmj = 0; //总计建筑面积 decimal Schf = 0; //总计测绘费 int Slzs = 0; //总计上年同期宗数 int Slts = 0; //总计上年同期套数 decimal Sljzmj = 0; //总计上年同期建筑面积 decimal Slchf = 0; //总计上年同期测绘费 string casetype = string.Empty; foreach (XDict wobj in list) { decimal jzmj = 0; decimal chf = 0; decimal ljzmj = 0; decimal lchf = 0; casetype = wobj["dname"].ToString();//类型名字 int zs = wobj.GetInt("zs"); int ts = wobj.GetInt("ts"); if (wobj["jzmj"].ToString() != "") { jzmj = Convert.ToDecimal(wobj["jzmj"].ToString()); } if (wobj["chf"].ToString() != "") { chf = Convert.ToDecimal(wobj["chf"].ToString()); } int lzs = wobj.GetInt("lzs"); int lts = wobj.GetInt("lzs"); if (wobj["ljzmj"].ToString() != "") { ljzmj = Convert.ToDecimal(wobj["ljzmj"].ToString()); } if (wobj["chf"].ToString() != "") { lchf = Convert.ToDecimal(wobj["lchf"].ToString()); } //////CellRangeAddress cellRangeAddress0 = new CellRangeAddress(1, 2, 0, 0);合并 //////sheet.AddMergedRegion(cellRangeAddress0); //////headerRow.CreateCell(0).SetCellValue("志愿者"); //CellRangeAddress cellRangeAddress0 = new CellRangeAddress(1, 2, 0, 0);//合并 //sheet.AddMergedRegion(cellRangeAddress0); for (int i = 0; i < 3; i++) { IRow dataRow = sheet.CreateRow(rowIndex); ++rowIndex; if (i == 0) { dataRow.CreateCell(1).SetCellValue(strdate);//参数 dataRow.CreateCell(2).SetCellValue(zs);//总数 dataRow.CreateCell(3).SetCellValue(ts);//套数 dataRow.CreateCell(4).SetCellValue((jzmj).ToString());//建筑面积(㎡) SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式 } else if (i == 1) { dataRow.CreateCell(0).SetCellValue(casetype);//案件类型 dataRow.CreateCell(1).SetCellValue("上年度同期");//参数 dataRow.CreateCell(2).SetCellValue(lzs);//总数 dataRow.CreateCell(3).SetCellValue(lts);//套数 dataRow.CreateCell(4).SetCellValue((ljzmj).ToString());//建筑面积(㎡) SetRowStyle(dataRow, cellstyle, 0, 1);//样式 SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式 } else if (i == 2) { dataRow.CreateCell(0).SetCellValue(""); dataRow.CreateCell(1).SetCellValue("与上年度对比");//参数 dataRow.CreateCell(2).SetCellValue((zs - lzs));//总数 dataRow.CreateCell(3).SetCellValue((ts - lts));//套数 dataRow.CreateCell(4).SetCellValue((jzmj - ljzmj).ToString());//建筑面积(㎡) SetRowStyle(dataRow, bottomrow, 0, 1); SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式 } } //CellRangeAddress cellRangeAddress0 = new CellRangeAddress(1, 3, 0, 0);//合并 //sheet.AddMergedRegion(cellRangeAddress0); //sheet.AddMergedRegion(new Region(2, 2, 4, 4)); Szs += zs; Sts += ts; Sjzmj += jzmj; Schf += chf; Slzs += lzs; Slts += lts; Sljzmj += ljzmj; } for (int i = 0; i < 3; i++) { IRow dataRows = sheet.CreateRow(rowIndex); ++rowIndex; //CellRangeAddress cellRangeAddress0 = new CellRangeAddress(1, 2, 0, 0);//合并 //sheet.AddMergedRegion(cellRangeAddress0); if (i == 0) { dataRows.CreateCell(1).SetCellValue(strdate);//参数 dataRows.CreateCell(2).SetCellValue(Szs);//总数 dataRows.CreateCell(3).SetCellValue(Sts);//套数 dataRows.CreateCell(4).SetCellValue((Sjzmj).ToString());//建筑面积(㎡) SetRowStyle(dataRows, headerRowStyle2, 1, 5);//样式 } else if (i == 1) { dataRows.CreateCell(0).SetCellValue("总计");//案件类型 dataRows.CreateCell(1).SetCellValue("上年度同期");//参数 dataRows.CreateCell(2).SetCellValue(Slzs);//总数 dataRows.CreateCell(3).SetCellValue(Slts);//套数 dataRows.CreateCell(4).SetCellValue((Sljzmj).ToString());//建筑面积(㎡) SetRowStyle(dataRows, cellstyle, 0, 1);//样式 SetRowStyle(dataRows, headerRowStyle2,1, 5);//样式 } else if (i == 2) { dataRows.CreateCell(0).SetCellValue(""); dataRows.CreateCell(1).SetCellValue("与上年度对比");//参数 dataRows.CreateCell(2).SetCellValue((Szs - Slzs));//总数 dataRows.CreateCell(3).SetCellValue((Sts - Slts));//套数 dataRows.CreateCell(4).SetCellValue((Sjzmj - Sljzmj).ToString());//建筑面积(㎡) SetRowStyle(dataRows, bottomrow, 0, 1); SetRowStyle(dataRows, headerRowStyle2, 1, 5);//样式 } } ////保存excel文档 ////sheet.ForceFormulaRecalculation = true; workbook.Write(ms); ms.Flush(); ms.Position = 0; return ms; }
@Kiss丿残阳: 你現在導出的樣子給我看看
@潘雪婷: 现在就想到这样的效果
@Kiss丿残阳: 這是你要的結果?還是你現在導出已經是這樣了?我要看的是你現在導出是什麼樣子的了?
@Kiss丿残阳: 你現在導出一下給我看看
@潘雪婷:
-----------------我想要的结果是下面的这幅图------------------------------------------
----------------------------------------最后面这幅图是我现在的结果-----------------------------
@Kiss丿残阳:
for (int i = 0; i < 3; i++)
{
IRow dataRow = sheet.CreateRow(rowIndex);
++rowIndex;
if (i == 0)
{
dataRow.CreateCell(1).SetCellValue(strdate);//参数
dataRow.CreateCell(2).SetCellValue(zs);//总数
dataRow.CreateCell(3).SetCellValue(ts);//套数
dataRow.CreateCell(4).SetCellValue((jzmj).ToString());//建筑面积(㎡)
SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式
}
else if (i == 1)
{
dataRow.CreateCell(0).SetCellValue(casetype);//案件类型
dataRow.CreateCell(1).SetCellValue("上年度同期");//参数
dataRow.CreateCell(2).SetCellValue(lzs);//总数
dataRow.CreateCell(3).SetCellValue(lts);//套数
dataRow.CreateCell(4).SetCellValue((ljzmj).ToString());//建筑面积(㎡)
SetRowStyle(dataRow, cellstyle, 0, 1);//样式
SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式
}
else if (i == 2)
{
dataRow.CreateCell(0).SetCellValue("");
dataRow.CreateCell(1).SetCellValue("与上年度对比");//参数
dataRow.CreateCell(2).SetCellValue((zs - lzs));//总数
dataRow.CreateCell(3).SetCellValue((ts - lts));//套数
dataRow.CreateCell(4).SetCellValue((jzmj - ljzmj).ToString());//建筑面积(㎡)
SetRowStyle(dataRow, bottomrow, 0, 1);
SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式
}
}
你这里的for 循环你设断点看看,按你的导出的效果看,你定义一个变量为1,就和rowIndex一样,你这个比较简单,都是每三行合并一次,在填充第一列数据的时候顺便合并就好了
int a = 1;
if (a <= rowIndex-2)
{
sheet.AddMergedRegion(new CellRangeAddress(a, a + 2, 0, 0));
a = a + 2;
}
@Kiss丿残阳: 我上面说错了,我写的那段你放在最后面,放在 workbook.Write(ms);前面,然后导出看看效果如何
@Kiss丿残阳: 我代码写错了,应该是这样子
for (int a = 1; a <= rowIndex - 2; a = a + 2)
{
sheet.AddMergedRegion(new CellRangeAddress(a, a + 2, 0, 0));
}
@潘雪婷: 好的,谢谢我先看下效果咯
@Kiss丿残阳: 不客气,也不知道行不行,希望可以帮到你而已
@潘雪婷: 非常感谢你给我思路问题已解决
@Kiss丿残阳: 不客气,解决了就好,互相帮助嘛,谁都有有困难的时候。
@潘雪婷: 多谢你提供思路给我这个是我调试好了的效果刚好是//合并第一列每每3个单元格合并为一个单元格
#region //合并第一列每每3个单元格合并为一个单元格
for (Int32 a = 1; a <= rowIndex - 3; a = a + 3)
{
CellRangeAddress range = new CellRangeAddress(a, a + 2, 0, 0);
sheet.AddMergedRegion(range);
}
#endregion
@Kiss丿残阳: 額,看來我的思路还是有些偏差,不过你解决了就好了,结果都是一样的,发现你的习惯非常好,还写注释,我每次都不写,感觉好麻烦,但确实很有用,我每次都是做完就不管了
用NPOI吧
对啊用的是npoi
那这样的单元格怎样合并呢,希望你能够给我个思路
@Kiss丿残阳:我自己没有去实现这个功能,不过这个功能官方DEMO也有吧。