话说,上次做了个自动化导入导出EXCEL数据程序,用的很是Happy.
但,实在是没想到脖子离职,一下子市场部所有的数据都压在了我一个人身上。
还是要花少量时间来COPY /PASTE,每天都觉得事情做不完。
无奈啊,作为一个懒惰的人,不得不再想办法,简化工作。
于是有了这次的大更新。
这次采用ASPOSE.CELLS来完成数据的导出,GEMBOX的模板功能太弱了,动不动无法导入模板。
虽然是采用了ASPOSE来完成,但自己也要动手来改一下它的数据导入到excel函数,改成使用自己写的,不然真的很崩溃,格式完全让我无语。
言归正传,将主要用到的方法写下来。
Aspose.Cells.Workbook mybook = new Aspose.Cells.Workbook();//实例化
mybook.Open(Application.StartupPath + "/Template/" + myTask.TaskTemplate);//加载模板
Aspose.Cells.Worksheet ws2 = mybook.Worksheets[myTask.SheetArea[i].name];//获取sheet
InsertData_ASPOSE(ws2, myTask.SheetArea[i]);//填充sheet
mybook.Save(textBox1.Text.ToString() + "/ASPOSE_" + myTask.TaskName + dateTimePicker1.Value.ToString("yyyyMMdd") + ".xls");//保存数据
改用自己编写的填充方法,主要是因为ASPOSE的格式存在问题,如果你多次对一个表进行操作的话。
private
void
InsertData_ASPOSE(Aspose.Cells.Worksheet ws, Moops.Info.Configuration.configurationTaskInfoSheetArea DataArea)
{
try
{
for ( int i = 0 ; i < DataArea.DataArea.Length; i ++ )
{
string key = DataArea.DataArea[i].datatype;
DataTable dt = ds1.Tables[ 0 ];
// DataTable dt = ds1.Tables[0].DefaultView.ToTable(false, DataArea.DataArea[i].data_column_name.Split(','));
DataTable dt_out = dt.Clone();
// DataRow aDataRow = dtItemPrice.NewRow();
// aDataRow.ItemArray = drItemPrices[i].ItemArray;
// dtItemPrice.Rows.Add(aDataRow);
DataRow[] myrows = dt.Select(myTask.DataType + " =' " + key + " ' " );
foreach (DataRow row in myrows)
{
dt_out.ImportRow(row);
}
DataTable dt_result = dt_out.DefaultView.ToTable( false , DataArea.DataArea[i].data_column_name.Split( ' , ' ));
string [] columnname = DataArea.DataArea[i].column_name.Split( ' , ' );
int s = columnname.Length - 1 ;
for ( int j = dt_result.Columns.Count - 1 ; j >= 0 ; j -- )
{
if (s >= 0 )
{
dt_result.Columns[j].ColumnName = columnname[s].ToString();
s -- ;
}
else
{
break ;
}
}
// int firstColumn = 0;
// firstColumn =((int)(Convert.ToChar(DataArea.DataArea[i].start_column.Substring(0, 1)))-(int)('A'));
// ws.Cells[DataArea.DataArea[i].start_column].PutValue(0);
// ws.ActiveCell = DataArea.DataArea[i].start_column;
// Aspose.Cells.Cell mycell = ws.Cells[DataArea.DataArea[i].start_column];
// mycell.PutValue(0);
// ws.ActiveCell = DataArea.DataArea[i].start_column;
InsertDataTableWithAspose(ws.Cells, dt_result, 0 , GetColumnIndex(DataArea.DataArea[i].start_column) , true );
// int sx = ws.Cells.ImportDataTable(dt_result, true,DataArea.DataArea[i].start_column);
// ws.AutoFitColumns();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
{
try
{
for ( int i = 0 ; i < DataArea.DataArea.Length; i ++ )
{
string key = DataArea.DataArea[i].datatype;
DataTable dt = ds1.Tables[ 0 ];
// DataTable dt = ds1.Tables[0].DefaultView.ToTable(false, DataArea.DataArea[i].data_column_name.Split(','));
DataTable dt_out = dt.Clone();
// DataRow aDataRow = dtItemPrice.NewRow();
// aDataRow.ItemArray = drItemPrices[i].ItemArray;
// dtItemPrice.Rows.Add(aDataRow);
DataRow[] myrows = dt.Select(myTask.DataType + " =' " + key + " ' " );
foreach (DataRow row in myrows)
{
dt_out.ImportRow(row);
}
DataTable dt_result = dt_out.DefaultView.ToTable( false , DataArea.DataArea[i].data_column_name.Split( ' , ' ));
string [] columnname = DataArea.DataArea[i].column_name.Split( ' , ' );
int s = columnname.Length - 1 ;
for ( int j = dt_result.Columns.Count - 1 ; j >= 0 ; j -- )
{
if (s >= 0 )
{
dt_result.Columns[j].ColumnName = columnname[s].ToString();
s -- ;
}
else
{
break ;
}
}
// int firstColumn = 0;
// firstColumn =((int)(Convert.ToChar(DataArea.DataArea[i].start_column.Substring(0, 1)))-(int)('A'));
// ws.Cells[DataArea.DataArea[i].start_column].PutValue(0);
// ws.ActiveCell = DataArea.DataArea[i].start_column;
// Aspose.Cells.Cell mycell = ws.Cells[DataArea.DataArea[i].start_column];
// mycell.PutValue(0);
// ws.ActiveCell = DataArea.DataArea[i].start_column;
InsertDataTableWithAspose(ws.Cells, dt_result, 0 , GetColumnIndex(DataArea.DataArea[i].start_column) , true );
// int sx = ws.Cells.ImportDataTable(dt_result, true,DataArea.DataArea[i].start_column);
// ws.AutoFitColumns();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private
int
InsertDataTableWithAspose(Aspose.Cells.Cells Cells, DataTable dataTable,
int
startRow,
int
startColumn,
bool
columnHeaders)
{
int num2;
int num3 = 0 ;
if (columnHeaders)
{
num2 = 0 ;
do
{
Cells[startRow, startColumn + num2].PutValue( dataTable.Columns[num2].ColumnName);
num2 ++ ;
}
while (num2 < dataTable.Columns.Count);
num3 ++ ;
}
int num = 0 ;
if (dataTable.Rows.Count > 0 )
{
do
{
num2 = 0 ;
do
{
Cells[startRow + num3 + num, startColumn + num2].PutValue(dataTable.Rows[num][num2]);
num2 ++ ;
}
while (num2 < dataTable.Columns.Count);
num ++ ;
}
while (num < dataTable.Rows.Count);
}
return (num + num3);
}
{
int num2;
int num3 = 0 ;
if (columnHeaders)
{
num2 = 0 ;
do
{
Cells[startRow, startColumn + num2].PutValue( dataTable.Columns[num2].ColumnName);
num2 ++ ;
}
while (num2 < dataTable.Columns.Count);
num3 ++ ;
}
int num = 0 ;
if (dataTable.Rows.Count > 0 )
{
do
{
num2 = 0 ;
do
{
Cells[startRow + num3 + num, startColumn + num2].PutValue(dataTable.Rows[num][num2]);
num2 ++ ;
}
while (num2 < dataTable.Columns.Count);
num ++ ;
}
while (num < dataTable.Rows.Count);
}
return (num + num3);
}
好了,差不多了,这样只要加载了数据,就可以填充到自己需要的模板中了。
哈哈,又可以HAPPY的轻松的应对工作了。
近期准备对用到EXCEL导入导出功能的一些控件作个总结,大概有EXCELLIBRAY,MYXLS,NPOI,GEMBOX,ASPOSE这几个主流的控件或者库。
整理一下这些东东的优缺点,也作为一个归档。