📄 commonexport.cs
字号:
using System;
using System.IO;
using System.Data;
using System.Data.Odbc;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace CommonComponent.CommonIE
{
/// <summary>
///
/// </summary>
public class CommonExport : System.ComponentModel.Component
{
public CommonExport()
{
//
// TODO: Add constructor logic here
//
}
/// <summary>
/// 导出文件名
/// </summary>
private string fileName;
/// <summary>
/// 导出后是否自动打开
/// </summary>
private bool autoOpen;
/// <summary>
/// 自动取得文件名
/// </summary>
private bool autoGetFileName;
/// <summary>
/// 需要导出的数据表
/// </summary>
private DataTable table;
/// <summary>
/// 选择导出的字段
/// </summary>
private bool selectField;
/// <summary>
/// 显示进度条
/// </summary>
private bool showProgress;
private OutFieldCollection outFields = new OutFieldCollection();
/// <summary>
/// 自动取得导出文件名
/// </summary>
public bool AutoGetFileName
{
get
{
return autoGetFileName;
}
set
{
autoGetFileName = value;
}
}
/// <summary>
/// 导出完成后自动打开文件
/// </summary>
public bool AutoOpen
{
get
{
return autoOpen;
}
set
{
autoOpen = value;
}
}
/// <summary>
/// 导出文件名称
/// </summary>
public string FileName
{
get
{
return fileName;
}
set
{
fileName = value;
}
}
/// <summary>
/// 导出时选择文件名
/// </summary>
public bool SelectField
{
get
{
return selectField;
}
set
{
selectField = value;
}
}
/// <summary>
/// 导出时显示进度条
/// </summary>
public bool ShowProgress
{
get
{
return showProgress;
}
set
{
showProgress = value;
}
}
/// <summary>
/// 需要导出的数据表
/// </summary>
public DataTable Table
{
get
{
return table;
}
set
{
table = value;
}
}
/// <summary>
/// 判断是否可以导出数据
/// </summary>
/// <returns>是否要以导出</returns>
private bool ReadyToExport()
{
if (table == null)
return false;
if (table.Rows.Count == 0)
return false;
return true;
}
private int GetColumnLength(string columnName)
{
Int32 length;
Int32 i;
try
{
length = 1;
foreach (DataRow drow in table.Rows)
{
i = System.Text.Encoding.Default.GetByteCount(drow[columnName].ToString());
if (i > length)
length = i;
}
return length;
}
catch
{
return 1;
}
}
private int GetColumnLength(int columnIndex)
{
Int32 length;
Int32 i;
try
{
length = 1;
foreach (DataRow drow in table.Rows)
{
i = System.Text.Encoding.Default.GetByteCount(drow[columnIndex].ToString());
if (i > length)
length = i;
}
return length;
}
catch
{
return 1;
}
}
private int GetColumnLength(DataColumn column)
{
Int32 length;
Int32 i;
try
{
length = 1;
foreach (DataRow drow in table.Rows)
{
i = System.Text.Encoding.Default.GetByteCount(drow[column].ToString());
if (i > length)
length = i;
}
return length;
}
catch
{
return 1;
}
}
/// <summary>
/// 取得合法文件名!
/// </summary>
/// <param name="fileExt">指定文件扩展名</param>
/// <returns>文件名</returns>
private string GetFileName(string fileExt)
{
string file_name;
fileExt = fileExt.ToLower().Trim();
SaveFileDialog saveDlg = new SaveFileDialog();
using(saveDlg)
{
switch (fileExt)
{
case ".xls":
saveDlg.Filter = "Microsoft Excel 工作簿(*.xls)|*.xls";
break;
case ".htm":
case ".html":
saveDlg.Filter = "网页(*.htm;*.html)|*.htm;*.html";
break;
case ".txt":
saveDlg.Filter = "文本文件(*.txt)|*.txt";
break;
case ".csv":
saveDlg.Filter = "CSV(逗号分隔)(*.csv)|*.csv";
break;
case ".dbf":
saveDlg.Filter = "Microsoft dBase(*.dbf)|*.dbf";
break;
case "":
return "";
default:
saveDlg.Filter = "所有文件(*.*)|*.*";
break;
}
file_name = Path.ChangeExtension(fileName,fileExt);
saveDlg.FileName = file_name;
saveDlg.CheckPathExists = false;
saveDlg.CheckFileExists = false;
saveDlg.OverwritePrompt = false;
if ((file_name == "") || autoGetFileName)
{
if(saveDlg.ShowDialog() != DialogResult.OK)
return "";
file_name = Path.ChangeExtension(saveDlg.FileName,fileExt);
}
if (file_name == "")
return "";
//判断文件是否存在!
while (File.Exists(file_name))
{
switch(MessageBox.Show("文件(" + file_name + ")已经存在,是否覆盖!","警告",MessageBoxButtons.YesNoCancel ,MessageBoxIcon.Warning ))
{
case DialogResult.Yes:
try
{
File.Delete(file_name);
}
catch
{
///不返回错误
}
if (! File.Exists(file_name))
return file_name;
else if (MessageBox.Show("移出文件失败,是否重新选择文件名?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question )== DialogResult.No)
return "";
break;
case DialogResult.No:
break;
case DialogResult.Cancel:
return "";
}
saveDlg.FileName = file_name;
if(saveDlg.ShowDialog() != DialogResult.OK)
return "";
file_name = Path.ChangeExtension(saveDlg.FileName,fileExt);
}
return file_name;
}
}
/// <summary>
/// 导出的字段
/// </summary>
private class OutField
{
private string field_Name;
private Int32 field_Index;
private Int32 field_Length;
/// <summary>
/// 字段名称
/// </summary>
public string Field_Name
{
get
{
return field_Name;
}
set
{
field_Name = value;
}
}
/// <summary>
/// 字段Index
/// </summary>
public Int32 Field_Index
{
get
{
return field_Index;
}
set
{
field_Index = value;
}
}
/// <summary>
/// 字段长度
/// </summary>
public Int32 Field_Length
{
get
{
return field_Length;
}
set
{
field_Length = value;
}
}
}
private class OutFieldCollection:System.Collections.CollectionBase
{
public int Add(OutField value)
{
// TODO: Add OutFieldCollection.Add implementation
return InnerList.Add(value);
}
public bool Contains(OutField value)
{
// TODO: Add OutFieldCollection.Contains implementation
return InnerList.Contains(value);
}
public int IndexOf(OutField value)
{
// TODO: Add OutFieldCollection.IndexOf implementation
return InnerList.IndexOf(value);
}
public void Insert(int index, OutField value)
{
// TODO: Add OutFieldCollection.Insert implementation
InnerList.Insert(index,value);
}
public void Remove(OutField value)
{
// TODO: Add OutFieldCollection.Remove implementation
InnerList.Remove(value);
}
public OutField this[int index]
{
get
{
// TODO: Add OutFieldCollection.this getter implementation
return (OutField)InnerList[index];
}
}
}
private void OpenFile(string fileName)
{
if (! autoOpen)
return;
if (! File.Exists(fileName))
return;
if (MessageBox.Show("文件导出完成,现在打开文件吗?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question) == DialogResult.Yes)
ShellExecute(GetDesktopWindow(),"open",fileName,"",Path.GetDirectoryName(fileName),3);
}
private bool GetFieldList()
{
ListViewItem lvItem;
OutField outField;
if ((table == null) || (table.Rows.Count == 0))
return false;
using(SelectFieldsForm fmSelectField = new SelectFieldsForm())
{
fmSelectField.FieldList.Items.Clear();
for(int i = 0; i < table.Columns.Count; i++)
{
///排除二进制字段!!
if ((table.Columns[i].DataType == System.Type.GetType("System.Byte[]"))
|| (table.Columns[i].DataType == System.Type.GetType("System.Object"))
|| (table.Columns[i].DataType == System.Type.GetType("System.Guid")))
continue;
lvItem = new ListViewItem();
lvItem.Text = table.Columns[i].Caption;
lvItem.SubItems.Add(i.ToString());
lvItem.Checked = true;
fmSelectField.FieldList.Items.Add(lvItem);
}
if (outFields.Count > 0)
{
foreach(ListViewItem item1 in fmSelectField.FieldList.Items)
{
foreach(OutField o in outFields)
{
if (item1.Text == o.Field_Name)
{
item1.Checked = true;
break;
}
}
}
}
else
foreach(ListViewItem item1 in fmSelectField.FieldList.Items)
item1.Checked = true;
if (selectField)
{
if (fmSelectField.ShowDialog() != DialogResult.OK)
return false;
}
outFields.Clear();
foreach(ListViewItem item1 in fmSelectField.FieldList.Items)
{
if (item1.Checked )
{
outField = new OutField();
outField.Field_Name = item1.Text;
outField.Field_Index = Convert.ToInt32(item1.SubItems[1].Text);
outFields.Add(outField);
}
}
}
if (outFields.Count == 0)
return false;
else
return true;
}
[DllImport("user32.dll",EntryPoint="GetDesktopWindow")]
public static extern IntPtr GetDesktopWindow();
[DllImport("shell32.dll", EntryPoint="ShellExecuteA")]
public static extern int ShellExecute(IntPtr hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);
public bool ExportToText(string separator,string fileExt)
{
string file_name;
string strLine;
DataRow drow;
if (! ReadyToExport())
return false;
if (fileExt == "")
fileExt = ".txt";
file_name = GetFileName(fileExt);
if (file_name == "")
return false;
if (! GetFieldList())
return false;
///判断分隔符是否合法
separator = separator.Replace("\r","").Replace("\n","");
if (separator == "")
separator = "\t";
//找开文件
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -