1142 lines
49 KiB
C#
1142 lines
49 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Data;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Web;
|
|
using NPOI.HPSF;
|
|
using NPOI.HSSF.UserModel;
|
|
using NPOI.SS.UserModel;
|
|
using DevExpress.XtraGrid;
|
|
using DevExpress.XtraGrid.Views.Grid;
|
|
using DevExpress.XtraGrid.Columns;
|
|
using System.Data.Common;
|
|
using System.Data.SqlClient;
|
|
using System.Windows.Forms;
|
|
using DevExpress.XtraEditors;
|
|
using CommonLib;
|
|
using DevExpress.XtraEditors.Repository;
|
|
using Lskj.PubUtils;
|
|
using ControlLib.inh;
|
|
using Lskj.MyControl.LookUp;
|
|
using Lskj.MyControl;
|
|
using Lskj.Excel;
|
|
|
|
namespace ExcelPlus
|
|
{
|
|
|
|
public class ExcelHelper
|
|
{
|
|
/// <summary>
|
|
/// DataTable导出到Excel文件
|
|
/// </summary>
|
|
/// <param name="dtSource">源DataTable</param>
|
|
/// <param name="strHeaderText">表头文本</param>
|
|
/// <param name="strFileName">保存位置</param>
|
|
/// <param name="strSheetName">工作表名称</param>
|
|
/// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>
|
|
public static void Export(DataTable dtSource, string strHeaderText, string strFileName, string strSheetName, string[] oldColumnNames, string[] newColumnNames)
|
|
{
|
|
if (strSheetName == "")
|
|
{
|
|
strSheetName = "Sheet";
|
|
}
|
|
using (MemoryStream ms = Export(dtSource, strHeaderText, strSheetName, oldColumnNames, newColumnNames))
|
|
{
|
|
using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
|
|
{
|
|
byte[] data = ms.ToArray();
|
|
fs.Write(data, 0, data.Length);
|
|
fs.Flush();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// DataTable导出到Excel的MemoryStream
|
|
/// </summary>
|
|
/// <param name="dtSource">源DataTable</param>
|
|
/// <param name="strHeaderText">表头文本</param>
|
|
/// <param name="strSheetName">工作表名称</param>
|
|
/// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>
|
|
public static MemoryStream Export(DataTable dtSource, string strHeaderText, string strSheetName, string[] oldColumnNames, string[] newColumnNames)
|
|
{
|
|
if (oldColumnNames.Length != newColumnNames.Length)
|
|
{
|
|
return new MemoryStream();
|
|
}
|
|
HSSFWorkbook workbook = new HSSFWorkbook();
|
|
//HSSFSheet sheet = workbook.CreateSheet();// workbook.CreateSheet();
|
|
ISheet sheet = workbook.CreateSheet(strSheetName);
|
|
|
|
#region 右击文件 属性信息
|
|
{
|
|
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
|
|
dsi.Company = "朗速科技";
|
|
workbook.DocumentSummaryInformation = dsi;
|
|
|
|
SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
|
|
if (HttpContext.Current.Session["realname"] != null)
|
|
{
|
|
si.Author = HttpContext.Current.Session["realname"].ToString();
|
|
}
|
|
else
|
|
{
|
|
if (HttpContext.Current.Session["username"] != null)
|
|
{
|
|
si.Author = HttpContext.Current.Session["username"].ToString();
|
|
}
|
|
} //填加xls文件作者信息
|
|
si.ApplicationName = "朗速ERP"; //填加xls文件创建程序信息
|
|
si.LastAuthor = "dingliang"; //填加xls文件最后保存者信息
|
|
si.Comments = "朗速ERP导出文件"; //填加xls文件作者信息
|
|
si.Title = strHeaderText; //填加xls文件标题信息
|
|
si.Subject = strHeaderText; //填加文件主题信息
|
|
si.CreateDateTime = DateTime.Now;
|
|
workbook.SummaryInformation = si;
|
|
}
|
|
#endregion
|
|
|
|
ICellStyle dateStyle = workbook.CreateCellStyle();
|
|
IDataFormat format = workbook.CreateDataFormat();
|
|
dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
|
|
|
|
#region 取得列宽
|
|
int[] arrColWidth = new int[oldColumnNames.Length];
|
|
for (int i = 0; i < oldColumnNames.Length; i++)
|
|
{
|
|
arrColWidth[i] = Encoding.GetEncoding(936).GetBytes(newColumnNames[i]).Length;
|
|
}
|
|
/*
|
|
foreach (DataColumn item in dtSource.Columns)
|
|
{
|
|
arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
|
|
}
|
|
* */
|
|
|
|
for (int i = 0; i < dtSource.Rows.Count; i++)
|
|
{
|
|
for (int j = 0; j < oldColumnNames.Length; j++)
|
|
{
|
|
int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][oldColumnNames[j]].ToString()).Length;
|
|
if (intTemp > arrColWidth[j])
|
|
{
|
|
arrColWidth[j] = intTemp;
|
|
}
|
|
}
|
|
/*
|
|
for (int j = 0; j < dtSource.Columns.Count; j++)
|
|
{
|
|
int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
|
|
if (intTemp > arrColWidth[j])
|
|
{
|
|
arrColWidth[j] = intTemp;
|
|
}
|
|
}
|
|
* */
|
|
}
|
|
#endregion
|
|
int rowIndex = 0;
|
|
|
|
foreach (DataRow row in dtSource.Rows)
|
|
{
|
|
#region 新建表,填充表头,填充列头,样式
|
|
if (rowIndex == 65535 || rowIndex == 0)
|
|
{
|
|
if (rowIndex != 0)
|
|
{
|
|
sheet = workbook.CreateSheet(strSheetName + ((int)rowIndex / 65535).ToString());
|
|
}
|
|
|
|
#region 表头及样式
|
|
{
|
|
IRow headerRow = sheet.CreateRow(0);
|
|
headerRow.HeightInPoints = 25;
|
|
headerRow.CreateCell(0).SetCellValue(strHeaderText);
|
|
|
|
ICellStyle headStyle = workbook.CreateCellStyle();
|
|
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
|
|
IFont font = workbook.CreateFont();
|
|
font.FontHeightInPoints = 20;
|
|
font.Boldweight = 700;
|
|
headStyle.SetFont(font);
|
|
|
|
headerRow.GetCell(0).CellStyle = headStyle;
|
|
//sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));
|
|
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
|
|
}
|
|
#endregion
|
|
|
|
|
|
#region 列头及样式
|
|
{
|
|
//HSSFRow headerRow = sheet.CreateRow(1);
|
|
IRow headerRow = sheet.CreateRow(1);
|
|
|
|
ICellStyle headStyle = workbook.CreateCellStyle();
|
|
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
|
|
IFont font = workbook.CreateFont();
|
|
font.FontHeightInPoints = 10;
|
|
font.Boldweight = 700;
|
|
headStyle.SetFont(font);
|
|
|
|
for (int i = 0; i < oldColumnNames.Length; i++)
|
|
{
|
|
headerRow.CreateCell(i).SetCellValue(newColumnNames[i]);
|
|
headerRow.GetCell(i).CellStyle = headStyle;
|
|
//设置列宽
|
|
sheet.SetColumnWidth(i, (arrColWidth[i] + 1) * 256);
|
|
}
|
|
/*
|
|
foreach (DataColumn column in dtSource.Columns)
|
|
{
|
|
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
|
|
headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
|
|
|
|
//设置列宽
|
|
sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
|
|
}
|
|
* */
|
|
}
|
|
#endregion
|
|
|
|
rowIndex = 2;
|
|
}
|
|
#endregion
|
|
|
|
|
|
#region 填充内容
|
|
IRow dataRow = sheet.CreateRow(rowIndex);
|
|
//foreach (DataColumn column in dtSource.Columns)
|
|
for (int i = 0; i < oldColumnNames.Length; i++)
|
|
{
|
|
ICell newCell = dataRow.CreateCell(i);
|
|
|
|
string drValue = row[oldColumnNames[i]].ToString();
|
|
|
|
switch (dtSource.Columns[oldColumnNames[i]].DataType.ToString())
|
|
{
|
|
case "System.String"://字符串类型
|
|
newCell.SetCellValue(drValue);
|
|
break;
|
|
case "System.DateTime"://日期类型
|
|
DateTime dateV;
|
|
DateTime.TryParse(drValue, out dateV);
|
|
newCell.SetCellValue(dateV);
|
|
|
|
newCell.CellStyle = dateStyle;//格式化显示
|
|
break;
|
|
case "System.Boolean"://布尔型
|
|
bool boolV = false;
|
|
bool.TryParse(drValue, out boolV);
|
|
newCell.SetCellValue(boolV);
|
|
break;
|
|
case "System.Int16"://整型
|
|
case "System.Int32":
|
|
case "System.Int64":
|
|
case "System.Byte":
|
|
int intV = 0;
|
|
int.TryParse(drValue, out intV);
|
|
newCell.SetCellValue(intV);
|
|
break;
|
|
case "System.Decimal"://浮点型
|
|
case "System.Double":
|
|
double doubV = 0;
|
|
double.TryParse(drValue, out doubV);
|
|
newCell.SetCellValue(doubV);
|
|
break;
|
|
case "System.DBNull"://空值处理
|
|
newCell.SetCellValue("");
|
|
break;
|
|
default:
|
|
newCell.SetCellValue("");
|
|
break;
|
|
}
|
|
|
|
}
|
|
#endregion
|
|
|
|
rowIndex++;
|
|
}
|
|
|
|
|
|
using (MemoryStream ms = new MemoryStream())
|
|
{
|
|
workbook.Write(ms);
|
|
ms.Flush();
|
|
ms.Position = 0;
|
|
|
|
//sheet.Dispose();
|
|
sheet = null;
|
|
workbook = null;
|
|
//workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
|
|
return ms;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 从表格中读取数据到Excel
|
|
/// </summary>
|
|
/// <param name="GridControlPub">需要导出的表格</param>
|
|
/// <returns></returns>
|
|
public static int ExportGrid(DevExpress.XtraGrid.GridControl GridControlPub)
|
|
{
|
|
SaveFileDialog saveFileDialog = new SaveFileDialog();
|
|
saveFileDialog.Title = "导出Excel";
|
|
saveFileDialog.Filter = "Excel文件(*.xls)|*.xls|Excel2007|*.xlsx|PDF文件|*.PDF|RTF文件|*.RTF|HTML文件|*.html";
|
|
DialogResult dialogResult = saveFileDialog.ShowDialog();
|
|
if (dialogResult == DialogResult.OK)
|
|
{
|
|
DevExpress.XtraPrinting.XlsExportOptions options = new DevExpress.XtraPrinting.XlsExportOptions();
|
|
if (saveFileDialog.FilterIndex == 1)
|
|
{
|
|
GridControlPub.ExportToXls(saveFileDialog.FileName);
|
|
}
|
|
if (saveFileDialog.FilterIndex == 2)
|
|
{
|
|
GridControlPub.ExportToXlsx(saveFileDialog.FileName);
|
|
}
|
|
if (saveFileDialog.FilterIndex == 3)
|
|
{
|
|
GridControlPub.ExportToPdf(saveFileDialog.FileName);
|
|
}
|
|
if (saveFileDialog.FilterIndex == 4)
|
|
{
|
|
GridControlPub.ExportToRtf(saveFileDialog.FileName);
|
|
}
|
|
if (saveFileDialog.FilterIndex == 5)
|
|
{
|
|
GridControlPub.ExportToHtml(saveFileDialog.FileName);
|
|
}
|
|
DevExpress.XtraEditors.XtraMessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/// <summary>
|
|
/// WEB导出DataTable到Excel
|
|
/// </summary>
|
|
/// <param name="dtSource">源DataTable</param>
|
|
/// <param name="strHeaderText">表头文本</param>
|
|
/// <param name="strFileName">文件名</param>
|
|
/// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>
|
|
public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName)
|
|
{
|
|
ExportByWeb(dtSource, strHeaderText, strFileName, "sheet");
|
|
}
|
|
|
|
/// <summary>
|
|
/// WEB导出DataTable到Excel
|
|
/// </summary>
|
|
/// <param name="dtSource">源DataTable</param>
|
|
/// <param name="strHeaderText">表头文本</param>
|
|
/// <param name="strFileName">输出文件名,包含扩展名</param>
|
|
/// <param name="oldColumnNames">要导出的DataTable列数组</param>
|
|
/// <param name="newColumnNames">导出后的对应列名</param>
|
|
public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName, string[] oldColumnNames, string[] newColumnNames)
|
|
{
|
|
ExportByWeb(dtSource, strHeaderText, strFileName, "sheet", oldColumnNames, newColumnNames);
|
|
}
|
|
|
|
/// <summary>
|
|
/// WEB导出DataTable到Excel
|
|
/// </summary>
|
|
/// <param name="dtSource">源DataTable</param>
|
|
/// <param name="strHeaderText">表头文本</param>
|
|
/// <param name="strFileName">输出文件名</param>
|
|
/// <param name="strSheetName">工作表名称</param>
|
|
public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName, string strSheetName)
|
|
{
|
|
HttpContext curContext = HttpContext.Current;
|
|
|
|
// 设置编码和附件格式
|
|
curContext.Response.ContentType = "application/vnd.ms-excel";
|
|
curContext.Response.ContentEncoding = Encoding.UTF8;
|
|
curContext.Response.Charset = "";
|
|
curContext.Response.AppendHeader("Content-Disposition",
|
|
"attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
|
|
|
|
//生成列
|
|
string columns = "";
|
|
for (int i = 0; i < dtSource.Columns.Count; i++)
|
|
{
|
|
if (i > 0)
|
|
{
|
|
columns += ",";
|
|
}
|
|
columns += dtSource.Columns[i].ColumnName;
|
|
}
|
|
|
|
curContext.Response.BinaryWrite(Export(dtSource, strHeaderText, strSheetName, columns.Split(','), columns.Split(',')).GetBuffer());
|
|
curContext.Response.End();
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 导出DataTable到Excel
|
|
/// </summary>
|
|
/// <param name="dtSource">要导出的DataTable</param>
|
|
/// <param name="strHeaderText">标题文字</param>
|
|
/// <param name="strFileName">文件名,包含扩展名</param>
|
|
/// <param name="strSheetName">工作表名</param>
|
|
/// <param name="oldColumnNames">要导出的DataTable列数组</param>
|
|
/// <param name="newColumnNames">导出后的对应列名</param>
|
|
public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName, string strSheetName, string[] oldColumnNames, string[] newColumnNames)
|
|
{
|
|
HttpContext curContext = HttpContext.Current;
|
|
|
|
// 设置编码和附件格式
|
|
curContext.Response.ContentType = "application/vnd.ms-excel";
|
|
curContext.Response.ContentEncoding = Encoding.UTF8;
|
|
curContext.Response.Charset = "";
|
|
curContext.Response.AppendHeader("Content-Disposition",
|
|
"attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
|
|
|
|
curContext.Response.BinaryWrite(Export(dtSource, strHeaderText, strSheetName, oldColumnNames, newColumnNames).GetBuffer());
|
|
curContext.Response.End();
|
|
}
|
|
|
|
/// <summary>读取excel
|
|
/// 默认第一行为表头,导入第一个工作表
|
|
/// </summary>
|
|
/// <param name="strFileName">excel文档路径</param>
|
|
/// <returns></returns>
|
|
public static DataTable Import(string strFileName)
|
|
{
|
|
DataTable dt = new DataTable();
|
|
|
|
HSSFWorkbook hssfworkbook = null;
|
|
try
|
|
{
|
|
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
|
|
{
|
|
hssfworkbook = new HSSFWorkbook(file);
|
|
}
|
|
}
|
|
catch (InvalidOperationException)
|
|
{
|
|
XtraMessageBox.Show("请删除文件最后一行统计行.");
|
|
return dt;
|
|
}
|
|
catch (IOException)
|
|
{
|
|
XtraMessageBox.Show("文件[" + strFileName + "] \r\n处于打开状态,请关闭后在读取文件.");
|
|
return dt;
|
|
}
|
|
|
|
ISheet sheet = hssfworkbook.GetSheetAt(0);
|
|
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
|
|
|
|
IRow headerRow = sheet.GetRow(0);
|
|
int cellCount = headerRow.LastCellNum;
|
|
try
|
|
{
|
|
for (int j = 0; j < cellCount; j++)
|
|
{
|
|
|
|
ICell cell = headerRow.GetCell(j);
|
|
dt.Columns.Add(cell + "");
|
|
|
|
}
|
|
|
|
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
|
|
{
|
|
IRow row = sheet.GetRow(i);
|
|
if (row == null) continue;
|
|
DataRow dataRow = dt.NewRow();
|
|
|
|
|
|
for (int j = row.FirstCellNum; j < cellCount; j++)
|
|
{
|
|
if (row.GetCell(j) != null)
|
|
{
|
|
if ((row.GetCell(j).CellType == CellType.Numeric) && (row.GetCell(j).ToString().IndexOf('-') != -1) && (row.GetCell(j).ToString()[0] != '-'))
|
|
dataRow[j] = row.GetCell(j).DateCellValue;
|
|
else
|
|
if (row.GetCell(j).CellType == CellType.Numeric)
|
|
dataRow[j] = row.GetCell(j).NumericCellValue;
|
|
else
|
|
{
|
|
ICell cell = row.GetCell(j);
|
|
IRichTextString richTextString = (IRichTextString)cell.RichStringCellValue;
|
|
string cellValue = string.Empty;
|
|
for (int m = 0; m < richTextString.Length; m++)
|
|
{
|
|
IFont font = sheet.Workbook.GetFontAt(richTextString.GetFontAtIndex(m));
|
|
string str = string.Empty;
|
|
string code= richTextString.ToString().Substring(m,1);
|
|
switch (font.TypeOffset)
|
|
{
|
|
case FontSuperScript.Sub:
|
|
str = ChemistryHelper.GetSubChar(code);
|
|
break;
|
|
|
|
case FontSuperScript.Super:
|
|
str = ChemistryHelper.GetSuperChar(code);
|
|
break;
|
|
default:
|
|
str = code;
|
|
break;
|
|
}
|
|
cellValue = cellValue + str;
|
|
}
|
|
|
|
cell.SetCellValue(cellValue);
|
|
dataRow[j] = cell + "";
|
|
//dataRow[j] = row.GetCell(j) + "";
|
|
}
|
|
}
|
|
}
|
|
dt.Rows.Add(dataRow);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
}
|
|
return dt;
|
|
}
|
|
public static DataTable Import(string strFileName, DataTable dt)
|
|
{
|
|
//DataTable dt = new DataTable();
|
|
int firstCell = dt.Columns.Count;
|
|
//MessageBox.Show(firstCell.ToString());
|
|
HSSFWorkbook hssfworkbook;
|
|
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
|
|
{
|
|
hssfworkbook = new HSSFWorkbook(file);
|
|
}
|
|
ISheet sheet = hssfworkbook.GetSheetAt(0);
|
|
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
|
|
|
|
IRow headerRow = sheet.GetRow(0);
|
|
int cellCount = headerRow.LastCellNum;
|
|
|
|
for (int j = 0; j < cellCount; j++)
|
|
{
|
|
ICell cell = headerRow.GetCell(j);
|
|
dt.Columns.Add(cell.ToString());
|
|
}
|
|
|
|
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
|
|
{
|
|
IRow row = sheet.GetRow(i);
|
|
DataRow dataRow = dt.NewRow();
|
|
|
|
for (int j = row.FirstCellNum; j < cellCount; j++)
|
|
{
|
|
if (row.GetCell(j) != null)
|
|
{
|
|
if (row.GetCell(j).CellType == CellType.Numeric)
|
|
dataRow[j + firstCell] = row.GetCell(j).NumericCellValue;
|
|
else
|
|
dataRow[j + firstCell] = row.GetCell(j).ToString();
|
|
}
|
|
}
|
|
dt.Rows.Add(dataRow);
|
|
}
|
|
return dt;
|
|
}
|
|
|
|
private static GridColumn getColumnByTitle(string title,GridView gridView)
|
|
{
|
|
GridColumn gc = null;
|
|
foreach (GridColumn item in gridView.Columns)
|
|
{
|
|
if (item.Caption.Equals(title))
|
|
{
|
|
gc = item;
|
|
break;
|
|
}
|
|
}
|
|
return gc;
|
|
}
|
|
|
|
public static void ImportByColumn(string strFileName, GridView gridView, Dictionary<string, DataTable> lookupDataSet,Panel parentPanel=null)
|
|
{
|
|
List<String> lsTitle = new List<string>();
|
|
HSSFWorkbook hssfworkbook;
|
|
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
|
|
{
|
|
hssfworkbook = new HSSFWorkbook(file);
|
|
}
|
|
ISheet sheet = hssfworkbook.GetSheetAt(0);
|
|
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
|
|
|
|
IRow headerRow = sheet.GetRow(0);
|
|
int cellCount = headerRow.LastCellNum;
|
|
|
|
for (int j = 0; j < cellCount; j++)
|
|
{
|
|
ICell cell = headerRow.GetCell(j);
|
|
lsTitle.Add(cell.ToString());
|
|
}
|
|
if (lsTitle.Count < 1)
|
|
{
|
|
MessageBox.Show("Excel文件中没有找到需要导入的列");
|
|
return;
|
|
}
|
|
try
|
|
{
|
|
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
|
|
{
|
|
gridView.AddNewRow();
|
|
IRow row = sheet.GetRow(i);
|
|
|
|
for (int j = row.FirstCellNum; j < cellCount; j++)
|
|
{
|
|
if ((row.GetCell(j) != null) && (row.GetCell(j).ToString() != ""))
|
|
{
|
|
GridColumn col = getColumnByTitle(lsTitle[j].ToString(), gridView);
|
|
if (col != null)
|
|
{
|
|
RepositoryItemSearchLookUpEdit lookup = col.ColumnEdit as RepositoryItemSearchLookUpEdit;
|
|
RepositoryItemLookUpEdit lookup1 = col.ColumnEdit as RepositoryItemLookUpEdit;
|
|
string tmpkey = "";
|
|
string tmpvalue = "";
|
|
if ((lookup != null) || (lookup1 != null))
|
|
{
|
|
if (lookup != null)
|
|
{
|
|
tmpkey = lookup.ValueMember;
|
|
tmpvalue = lookup.DisplayMember;
|
|
}
|
|
else
|
|
{
|
|
tmpkey = lookup1.ValueMember;
|
|
tmpvalue = lookup1.DisplayMember;
|
|
}
|
|
|
|
DataRow[] tmpdr = null;
|
|
if ((lookupDataSet[col.FieldName].Prefix != "") && (parentPanel != null))
|
|
{
|
|
string ctlName = lookupDataSet[col.FieldName].Prefix;
|
|
ctlName = ctlName.Replace("_parent_","txt_");
|
|
Control[] ctl = parentPanel.Controls.Find(ctlName, true);
|
|
string pKey = "";
|
|
if ((ctl!=null) &&(ctl.Length>0))
|
|
pKey = GetControlText(ctl[0]);
|
|
|
|
tmpdr = lookupDataSet[col.FieldName].Select(tmpvalue + "='" + row.GetCell(j).ToString() + "' and " + lookupDataSet[col.FieldName].Prefix + "='" + pKey + "'");
|
|
}
|
|
else
|
|
tmpdr = lookupDataSet[col.FieldName].Select(tmpvalue + "='" + row.GetCell(j).ToString() + "'");
|
|
if ((tmpdr != null) && (tmpdr.Length > 0))
|
|
gridView.SetFocusedRowCellValue(col, tmpdr[0][tmpkey] + "");
|
|
|
|
}
|
|
else
|
|
{
|
|
if (row.GetCell(j).ToString() == "校验")
|
|
gridView.SetFocusedRowCellValue(col, "1");
|
|
else if (row.GetCell(j).ToString() == "非校验")
|
|
gridView.SetFocusedRowCellValue(col, "1");
|
|
else
|
|
gridView.SetFocusedRowCellValue(col, row.GetCell(j).ToString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
gridView.PostEditor();
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 取指定组件值
|
|
/// </summary>
|
|
/// <param name="parent"></param>
|
|
/// <param name="list"></param>
|
|
public static string GetControlText(Control control)
|
|
{
|
|
if (control == null)
|
|
return "";
|
|
if (control.Tag == null)
|
|
{
|
|
return control.Text;
|
|
}
|
|
ControlModelTag cmTag = control.Tag as ControlModelTag;
|
|
if (cmTag.fieldTypeId == ControlType.LabAutoSeacherText)
|
|
{
|
|
return control.Text;
|
|
}
|
|
else if ((cmTag.fieldTypeId == ControlType.LabAutoSeacherValue) ||
|
|
(cmTag.fieldTypeId == ControlType.LabComboxValueParam))
|
|
{
|
|
AutoSearcher te = control as AutoSearcher;
|
|
|
|
return te.ReturnValue.ToString();
|
|
}
|
|
else if (cmTag.fieldTypeId == ControlType.LabMultiSelectValue)
|
|
{
|
|
LabelLookUp lookup = control as LabelLookUp;
|
|
return lookup.ReturnValue;
|
|
}
|
|
else if (cmTag.fieldTypeId == ControlType.LabComboxValue)
|
|
{
|
|
LabelComboxEx Cb = control as LabelComboxEx;
|
|
return Cb.getComboBox.SelectedValue + "";
|
|
}
|
|
else if (cmTag.fieldTypeId == ControlType.LabComboxText)
|
|
{
|
|
LabelComboxEx Cb = control as LabelComboxEx;
|
|
return Cb.getComboBox.Text;
|
|
}
|
|
else if (cmTag.fieldTypeId == ControlType.LabDate ||
|
|
cmTag.fieldTypeId == ControlType.LabDateTime ||
|
|
cmTag.fieldTypeId == ControlType.LabDateTimeShort ||
|
|
cmTag.fieldTypeId == ControlType.LabTime ||
|
|
cmTag.fieldTypeId == ControlType.LabShortTime)
|
|
{
|
|
LabelDateEx Cb = control as LabelDateEx;
|
|
return Cb.GetDateTimePicker.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
|
}
|
|
else if (cmTag.fieldTypeId == ControlType.LabTextInt)
|
|
{
|
|
if ((control.Text.Trim() == ""))
|
|
return "0";
|
|
else
|
|
return control.Text;
|
|
}
|
|
else
|
|
{
|
|
if (cmTag.fieldTypeId != 99)
|
|
{
|
|
return control.Text;
|
|
}
|
|
}
|
|
return "0";
|
|
}
|
|
|
|
public static void ImportByColumn(string strFileName, GridView gridView, Dictionary<string, DataTable> lookupDataSet, string KeyFieldName, Panel parentPanel = null)
|
|
{
|
|
if (KeyFieldName.Trim()=="")
|
|
{
|
|
MessageBox.Show("未指定主键字段,不能更新导入");
|
|
return;
|
|
}
|
|
string KeyFieldCnName = "";
|
|
GridColumn keyColumn = gridView.Columns.ColumnByFieldName(KeyFieldName);
|
|
if (keyColumn==null)
|
|
{
|
|
MessageBox.Show("没有找到指定的关键字段,不能更新导入");
|
|
return;
|
|
}
|
|
KeyFieldCnName = keyColumn.Caption;
|
|
if (KeyFieldCnName == "")
|
|
KeyFieldCnName = KeyFieldName;
|
|
|
|
List<String> lsTitle = new List<string>();
|
|
HSSFWorkbook hssfworkbook;
|
|
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
|
|
{
|
|
hssfworkbook = new HSSFWorkbook(file);
|
|
}
|
|
ISheet sheet = hssfworkbook.GetSheetAt(0);
|
|
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
|
|
|
|
IRow headerRow = sheet.GetRow(0);
|
|
int cellCount = headerRow.LastCellNum;
|
|
|
|
for (int j = 0; j < cellCount; j++)
|
|
{
|
|
ICell cell = headerRow.GetCell(j);
|
|
lsTitle.Add(cell.ToString());
|
|
}
|
|
if (lsTitle.Count < 1)
|
|
{
|
|
MessageBox.Show("Excel文件中没有找到需要导入的列,不能更新导入");
|
|
return;
|
|
}
|
|
//MessageBox.Show(KeyFieldCnName);
|
|
int KeyFieldIndex = lsTitle.IndexOf(KeyFieldCnName);
|
|
if (KeyFieldIndex==-1)
|
|
{
|
|
MessageBox.Show("Excel文件中没有找到主键列,不能更新导入");
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
|
|
{
|
|
|
|
//gridView.AddNewRow();
|
|
IRow row = sheet.GetRow(i);
|
|
object keyValue = row.GetCell(KeyFieldIndex);
|
|
if ((keyValue == null)||keyValue.ToString()=="")
|
|
{
|
|
MessageBox.Show("没有主键值,不能更新导入");
|
|
return;
|
|
}
|
|
if (keyColumn.ColumnType.Name.Contains("Int32"))
|
|
{
|
|
keyValue = Convert.ToInt32(keyValue.ToString());
|
|
}
|
|
if (keyColumn.ColumnType.Name.Contains("Int64"))
|
|
{
|
|
keyValue = Convert.ToInt64(keyValue.ToString());
|
|
}
|
|
int updRowIndex = gridView.LocateByValue(KeyFieldName, keyValue, null);
|
|
if (updRowIndex < 0)
|
|
{
|
|
MessageBox.Show("没有找到主键["+ keyValue+"],不能更新导入");
|
|
return;
|
|
}
|
|
gridView.SelectRow(updRowIndex);
|
|
gridView.FocusedRowHandle = updRowIndex;
|
|
|
|
for (int j = row.FirstCellNum; j < cellCount; j++)
|
|
{
|
|
if (j == KeyFieldIndex)
|
|
continue;
|
|
if ((row.GetCell(j) != null) && (row.GetCell(j).ToString() != ""))
|
|
{
|
|
GridColumn col = getColumnByTitle(lsTitle[j].ToString(), gridView);
|
|
|
|
if (col != null)
|
|
{
|
|
RepositoryItemSearchLookUpEdit lookup = col.ColumnEdit as RepositoryItemSearchLookUpEdit;
|
|
RepositoryItemLookUpEdit lookup1 = col.ColumnEdit as RepositoryItemLookUpEdit;
|
|
string tmpkey = "";
|
|
string tmpvalue = "";
|
|
if ((lookup != null) || (lookup1 != null))
|
|
{
|
|
if (lookup != null)
|
|
{
|
|
tmpkey = lookup.ValueMember;
|
|
tmpvalue = lookup.DisplayMember;
|
|
}
|
|
else
|
|
{
|
|
tmpkey = lookup1.ValueMember;
|
|
tmpvalue = lookup1.DisplayMember;
|
|
}
|
|
|
|
DataRow[] tmpdr = null;
|
|
if ((lookupDataSet[col.FieldName].Prefix != "") && (parentPanel != null))
|
|
{
|
|
string ctlName = lookupDataSet[col.FieldName].Prefix;
|
|
ctlName = ctlName.Replace("_parent_", "txt_");
|
|
Control[] ctl = parentPanel.Controls.Find(ctlName, true);
|
|
string pKey = "";
|
|
if ((ctl != null) && (ctl.Length > 0))
|
|
pKey = GetControlText(ctl[0]);
|
|
|
|
tmpdr = lookupDataSet[col.FieldName].Select(tmpvalue + "='" + row.GetCell(j).ToString() + "' and " + lookupDataSet[col.FieldName].Prefix + "='" + pKey + "'");
|
|
}
|
|
else
|
|
tmpdr = lookupDataSet[col.FieldName].Select(tmpvalue + "='" + row.GetCell(j).ToString() + "'");
|
|
|
|
//DataRow[] tmpdr = lookupDataSet[col.FieldName].Select(tmpvalue + "='" + row.GetCell(j).ToString() + "'");
|
|
if ((tmpdr != null) && (tmpdr.Length > 0))
|
|
gridView.SetFocusedRowCellValue(col, tmpdr[0][tmpkey] + "");
|
|
|
|
}
|
|
else
|
|
{
|
|
if (row.GetCell(j).ToString() == "校验")
|
|
gridView.SetFocusedRowCellValue(col, "1");
|
|
else if (row.GetCell(j).ToString() == "非校验")
|
|
gridView.SetFocusedRowCellValue(col, "1");
|
|
else
|
|
gridView.SetFocusedRowCellValue(col, row.GetCell(j).ToString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
gridView.PostEditor();
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 从Excel中获取数据到DataTable
|
|
/// </summary>
|
|
/// <param name="strFileName">Excel文件全路径</param>
|
|
/// <param name="table">要保存的实体表名</param>
|
|
/// <param name="apply">是否需要提交到数据库</param>
|
|
/// <param name="grid">需要导入的表格</param>
|
|
/// <returns></returns>
|
|
public static DataTable ImportToGrid(string strFileName, string table, bool apply, GridControl grid)
|
|
{
|
|
|
|
DataTable dtDest = (DataTable)grid.DataSource;
|
|
GridView gridV = (GridView)grid.FocusedView;
|
|
string fields = "";
|
|
if (dtDest == null)
|
|
{
|
|
dtDest = new DataTable();
|
|
foreach (GridColumn gc in gridV.Columns)
|
|
{
|
|
if (gc.FieldName.Trim() != "")
|
|
{
|
|
fields = fields + gc.FieldName + ",";
|
|
dtDest.Columns.Add(gc.FieldName);
|
|
}
|
|
}
|
|
fields = fields.Substring(0, fields.Length - 1);
|
|
}
|
|
DataTable dtSource = Import(strFileName);
|
|
if (dtSource.Rows.Count < 1)
|
|
{
|
|
//XtraMessageBox.Show("指定文件没有数据可导入", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return dtDest;
|
|
}
|
|
|
|
foreach (DataRow dr in dtSource.Rows)
|
|
{
|
|
DataRow dstRow = dtDest.NewRow();
|
|
foreach (GridColumn gc in gridV.Columns)
|
|
{
|
|
try
|
|
{
|
|
dstRow[gc.FieldName] = dr[gc.Caption];
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
}
|
|
}
|
|
|
|
dtDest.Rows.Add(dstRow);
|
|
}
|
|
//是否提交数据库
|
|
if (apply == true)
|
|
{
|
|
try
|
|
{
|
|
string sql = "select " + fields + " from " + table + " where 1<>1";
|
|
DbDataAdapter dat = SqlHelper.ExecuteAdapter(CommandType.Text, sql);
|
|
SqlCommandBuilder scb = new SqlCommandBuilder((SqlDataAdapter)dat);
|
|
DataTable datatb = new DataTable();
|
|
dat.Fill(datatb);
|
|
dat.Update(dtDest);
|
|
dtDest.AcceptChanges();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show("数据提交错误:\n" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
|
|
}
|
|
grid.DataSource = dtDest;
|
|
return dtDest;
|
|
}
|
|
/// <summary>
|
|
/// 从Excel中获取数据到DataTable
|
|
/// </summary>
|
|
/// <param name="strFileName">Excel文件全路径(服务器路径)</param>
|
|
/// <param name="SheetName">要获取数据的工作表名称</param>
|
|
/// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param>
|
|
/// <returns></returns>
|
|
public static DataTable RenderDataTableFromExcel(string strFileName, string SheetName, int HeaderRowIndex)
|
|
{
|
|
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
|
|
{
|
|
IWorkbook workbook = new HSSFWorkbook(file);
|
|
return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 从Excel中获取数据到DataTable
|
|
/// </summary>
|
|
/// <param name="strFileName">Excel文件全路径(服务器路径)</param>
|
|
/// <param name="SheetIndex">要获取数据的工作表序号(从0开始)</param>
|
|
/// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param>
|
|
/// <returns></returns>
|
|
public static DataTable RenderDataTableFromExcel(string strFileName, int SheetIndex, int HeaderRowIndex)
|
|
{
|
|
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
|
|
{
|
|
IWorkbook workbook = new HSSFWorkbook(file);
|
|
string SheetName = workbook.GetSheetName(SheetIndex);
|
|
return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 从Excel中获取数据到DataTable
|
|
/// </summary>
|
|
/// <param name="ExcelFileStream">Excel文件流</param>
|
|
/// <param name="SheetName">要获取数据的工作表名称</param>
|
|
/// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param>
|
|
/// <returns></returns>
|
|
public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex)
|
|
{
|
|
IWorkbook workbook = new HSSFWorkbook(ExcelFileStream);
|
|
ExcelFileStream.Close();
|
|
return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 从Excel中获取数据到DataTable
|
|
/// </summary>
|
|
/// <param name="ExcelFileStream">Excel文件流</param>
|
|
/// <param name="SheetIndex">要获取数据的工作表序号(从0开始)</param>
|
|
/// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param>
|
|
/// <returns></returns>
|
|
public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex)
|
|
{
|
|
IWorkbook workbook = new HSSFWorkbook(ExcelFileStream);
|
|
ExcelFileStream.Close();
|
|
string SheetName = workbook.GetSheetName(SheetIndex);
|
|
return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 从Excel中获取数据到DataTable
|
|
/// </summary>
|
|
/// <param name="workbook">要处理的工作薄</param>
|
|
/// <param name="SheetName">要获取数据的工作表名称</param>
|
|
/// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param>
|
|
/// <returns></returns>
|
|
public static DataTable RenderDataTableFromExcel(IWorkbook workbook, string SheetName, int HeaderRowIndex)
|
|
{
|
|
ISheet sheet = workbook.GetSheet(SheetName);
|
|
DataTable table = new DataTable();
|
|
try
|
|
{
|
|
IRow headerRow = sheet.GetRow(HeaderRowIndex);
|
|
int cellCount = headerRow.LastCellNum;
|
|
|
|
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
|
|
{
|
|
DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
|
|
table.Columns.Add(column);
|
|
}
|
|
|
|
int rowCount = sheet.LastRowNum;
|
|
|
|
#region 循环各行各列,写入数据到DataTable
|
|
for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum; i++)
|
|
{
|
|
IRow row = sheet.GetRow(i);
|
|
DataRow dataRow = table.NewRow();
|
|
for (int j = row.FirstCellNum; j < cellCount; j++)
|
|
{
|
|
ICell cell = row.GetCell(j);
|
|
if (cell == null)
|
|
{
|
|
dataRow[j] = null;
|
|
}
|
|
else
|
|
{
|
|
//dataRow[j] = cell.ToString();
|
|
switch (cell.CellType)
|
|
{
|
|
case CellType.Blank:
|
|
dataRow[j] = null;
|
|
break;
|
|
case CellType.Boolean:
|
|
dataRow[j] = cell.BooleanCellValue;
|
|
break;
|
|
case CellType.Numeric:
|
|
dataRow[j] = cell.ToString();
|
|
break;
|
|
case CellType.String:
|
|
dataRow[j] = cell.StringCellValue;
|
|
break;
|
|
case CellType.Error:
|
|
dataRow[j] = cell.ErrorCellValue;
|
|
break;
|
|
case CellType.Formula:
|
|
default:
|
|
dataRow[j] = "=" + cell.CellFormula;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
table.Rows.Add(dataRow);
|
|
//dataRow[j] = row.GetCell(j).ToString();
|
|
}
|
|
#endregion
|
|
}
|
|
catch (System.Exception ex)
|
|
{
|
|
table.Clear();
|
|
table.Columns.Clear();
|
|
table.Columns.Add("出错了");
|
|
DataRow dr = table.NewRow();
|
|
dr[0] = ex.Message;
|
|
table.Rows.Add(dr);
|
|
return table;
|
|
}
|
|
finally
|
|
{
|
|
//sheet.Dispose();
|
|
workbook = null;
|
|
sheet = null;
|
|
}
|
|
#region 清除最后的空行
|
|
for (int i = table.Rows.Count - 1; i > 0; i--)
|
|
{
|
|
bool isnull = true;
|
|
for (int j = 0; j < table.Columns.Count; j++)
|
|
{
|
|
if (table.Rows[i][j] != null)
|
|
{
|
|
if (table.Rows[i][j].ToString() != "")
|
|
{
|
|
isnull = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (isnull)
|
|
{
|
|
table.Rows[i].Delete();
|
|
}
|
|
}
|
|
#endregion
|
|
return table;
|
|
}
|
|
|
|
#region 导出Excel
|
|
/// <summary>
|
|
/// 导出Excel
|
|
/// </summary>
|
|
/// <param name="GridControlPub"></param>
|
|
/// <returns></returns>
|
|
public static int SaveXls(DevExpress.XtraGrid.GridControl GridControlPub)
|
|
{
|
|
SaveFileDialog saveFileDialog = new SaveFileDialog();
|
|
saveFileDialog.Title = "导出Excel";
|
|
saveFileDialog.Filter = "Excel文件(*.xls)|*.xls|Excel2007|*.xlsx|PDF文件|*.PDF|RTF文件|*.RTF|HTML文件|*.html";
|
|
DialogResult dialogResult = saveFileDialog.ShowDialog();
|
|
if (dialogResult == DialogResult.OK)
|
|
{
|
|
DevExpress.XtraPrinting.XlsExportOptions options = new DevExpress.XtraPrinting.XlsExportOptions();
|
|
if (saveFileDialog.FilterIndex == 1)
|
|
{
|
|
GridControlPub.ExportToXls(saveFileDialog.FileName);
|
|
}
|
|
if (saveFileDialog.FilterIndex == 2)
|
|
{
|
|
GridControlPub.ExportToXlsx(saveFileDialog.FileName);
|
|
}
|
|
if (saveFileDialog.FilterIndex == 3)
|
|
{
|
|
GridControlPub.ExportToPdf(saveFileDialog.FileName);
|
|
}
|
|
if (saveFileDialog.FilterIndex == 4)
|
|
{
|
|
GridControlPub.ExportToRtf(saveFileDialog.FileName);
|
|
}
|
|
if (saveFileDialog.FilterIndex == 5)
|
|
{
|
|
GridControlPub.ExportToHtml(saveFileDialog.FileName);
|
|
}
|
|
XtraMessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
return 1;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|