一个下载excel合并的方法

-一个大坑 2018-12-10 04:36:26

单号一样的合并,其中有4列按顺序判断是否合并
厂别一样,终点一样才合并,厂别不一样,终点、栈板、纸箱一样也不合并
栈板合并要看厂别、终点是不是都一样,以此类推
因为加了几个判断,导致很多代码好像有重复的
//excel下載合併
public void ExportExcel(DataTable dt, string thName, int rnoColumn, int sqeColunmn, int[] orderMerge, string path)
{
string[] thNameArr = thName.Split(',');
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet();
IRow dataRow = sheet.CreateRow(0);
Hashtable tdHT = new Hashtable();
Hashtable mergeHT = new Hashtable();

//设置单元格的样式
HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.CENTER; //垂直对齐居中
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;

for (int i = 0; i < dt.Columns.Count; i++)
{
ICell icell = dataRow.CreateCell(i);
icell.SetCellValue(thNameArr[i].ToString()); //填充表头
icell.CellStyle = style; //設置樣式
tdHT.Add(i, 0); //初始化Hashtable。用来记录要合并的Excel的行号
mergeHT.Add(i, 0); //初始化Hashtable。用来记录要合并多少行Excel
}

//填充内容,dt從0行開始,excel0行是標題,從1行開始
for (int i = 0; i < dt.Rows.Count; i++)
{
dataRow = sheet.CreateRow(i + 1);
if (i != dt.Rows.Count - 1)
{
if (dt.Rows[i][rnoColumn].ToString() == dt.Rows[i + 1][rnoColumn].ToString() && dt.Rows[i][sqeColunmn].ToString() == dt.Rows[i + 1][sqeColunmn].ToString())
{
for (int j = 0; j < dt.Columns.Count; j++)
{
//判斷是不是在按順序排列的數組
if (orderMerge == null || Array.IndexOf(orderMerge, j) == -1)
{
//給表格賦值和設置格式
ICell icell = dataRow.CreateCell(j);
icell.SetCellValue(dt.Rows[i][j].ToString());
icell.CellStyle = style;

if (dt.Rows[i][j].ToString() == dt.Rows[i + 1][j].ToString())
{
int mergeRow = (int)mergeHT[j];
mergeHT.Remove(j);
mergeHT.Add(j, mergeRow + 1); //內容一樣,合併行+1
}
else
{
//內容不一樣,合併單元格,填充內容和設置樣式
int row = (int)tdHT[j] + 1;
int col = (int)mergeHT[j];
sheet.AddMergedRegion(new CellRangeAddress(row, row + col, j, j));

//更新行號和和合併行
tdHT.Remove(j);
tdHT.Add(j, i);
mergeHT.Remove(j);
mergeHT.Add(j, 0);
}
}
else
{
if (dt.Rows[i][j].ToString() == dt.Rows[i + 1][j].ToString())
{
//給表格賦值和設置格式
ICell icell = dataRow.CreateCell(j);
icell.SetCellValue(dt.Rows[i][j].ToString());
icell.CellStyle = style;

int mergeRow = (int)mergeHT[j];
mergeHT.Remove(j);
mergeHT.Add(j, mergeRow + 1); //內容一樣,合併行+1
}
else
{
//按順序對比,遇到不一樣的,數組內後面的不合併
for (int z=j; z <= (int)orderMerge[orderMerge.Length-1]; z++)
{
//給表格賦值和設置格式
ICell icell = dataRow.CreateCell(z);
icell.SetCellValue(dt.Rows[i][z].ToString());
icell.CellStyle = style;

//內容不一樣,合併單元格,填充內容和設置樣式
int row = (int)tdHT[z] + 1;
int col = (int)mergeHT[z];
sheet.AddMergedRegion(new CellRangeAddress(row, row + col, z, z));

//更新行號和和合併行
tdHT.Remove(z);
tdHT.Add(z, i);
mergeHT.Remove(z);
mergeHT.Add(z, 0);
j = z;
}
}

}
}
}
else
{
//單號不一樣,開始合併,并把td的值寫入到excel
for (int j = 0; j < dt.Columns.Count; j++)
{
//給表格賦值和設置格式
ICell icell = dataRow.CreateCell(j);
icell.SetCellValue(dt.Rows[i][j].ToString());
icell.CellStyle = style;

//合併單元格
int row = (int)tdHT[j] + 1;
int col = (int)mergeHT[j];
sheet.AddMergedRegion(new CellRangeAddress(row, row + col, j, j));
}

//单号不同,清空Hashtable,然后新增Hashtable,值为当前行
tdHT.Clear();
mergeHT.Clear();
for (int z = 0; z < dt.Columns.Count; z++)
{
tdHT.Add(z, i);
mergeHT.Add(z, 0);
}
}
}
else
{
//最後一行,開始合併,并把td的值寫入到excel
for (int j = 0; j < dt.Columns.Count; j++)
{
//給表格賦值和設置格式
ICell icell = dataRow.CreateCell(j);
icell.SetCellValue(dt.Rows[i][j].ToString());
icell.CellStyle = style;

//合併單元格
int row = (int)tdHT[j] + 1;
int col = (int)mergeHT[j];
sheet.AddMergedRegion(new CellRangeAddress(row, row + col, j, j));
}
}
}

//列宽自适应,只对英文和数字有效
for (int i = 0; i <= dt.Rows.Count; i++)
{
sheet.AutoSizeColumn(i);
}

using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
workbook.Write(fs);
fs.Dispose();
}

}
...全文
92 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
-一个大坑 2018-12-12
  • 打赏
  • 举报
回复
UI可以直接根据GridView下载excel,也是合并的

//下載excel
protected void BtnDownload_Click(object sender, EventArgs e)
{
this.locUI.ClearMessage();
string excelName = "申请单報表";
BindIMPDocHead(); //查詢
this.gridView.Columns[0].Visible = false;
this.gridView.Attributes.Add("style", "vnd.ms-excel.numberformat:@");
this.locUI.GridViewDownloadExcel(this.gridView, excelName);
}

//重写VerifyRenderingInServerForm方法,阻止系统调用默认的VerifyRenderingInServerForm方法。不然GridView導出excel會報錯
public override void VerifyRenderingInServerForm(Control control)
{

}
Hello World, 2018-12-12
  • 打赏
  • 举报
回复
发错链接,更新:JS合并相同单元格
Hello World, 2018-12-12
  • 打赏
  • 举报
回复
先把数据写到表里,再进行合并,合并功能指定起始行、列,递归调用即可,参考JS版本的

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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