年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

311 lines
13 KiB

using ESRI.ArcGIS.Geodatabase;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace KGIS.Plugin.LayerProperty2.Utils
{
public class ExportExcel
{
public static string ExportData(List<DataColumnEx> lstDataColumnEx, DataTable dtData)
{
System.Text.StringBuilder strBuilder = new System.Text.StringBuilder();
if (lstDataColumnEx != null && lstDataColumnEx.Count > 0)
{
List<string> headers = new List<string>();
lstDataColumnEx.ForEach(col =>
{
headers.Add(FormatCSVField(col.ChineseName));
});
string headerStr = String.Join("", headers.ToArray());
headerStr = headerStr.TrimStart('\t');
strBuilder
.Append(headerStr)
.Append("\t\n");
foreach (DataRow dr in dtData.Rows)
{
List<string> csvRow = new List<string>();
foreach (DataColumnEx col in lstDataColumnEx)
{
csvRow.Add(FormatCSVField(dr[col.ColumnName].ToTrim()));
}
string fieldStr = String.Join("", csvRow.ToArray());
fieldStr = fieldStr.TrimStart('\t');
strBuilder
.Append(fieldStr)
.Append("\t\n");
}
}
return strBuilder.ToString();
}
public static string ExportData(List<DataColumnEx> lstDataColumnEx)
{
System.Text.StringBuilder strBuilder = new System.Text.StringBuilder();
if (lstDataColumnEx != null && lstDataColumnEx.Count > 0)
{
List<string> headers = new List<string>();
lstDataColumnEx.ForEach(col =>
{
headers.Add(FormatCSVField(col.ChineseName));
});
string headerStr = String.Join("", headers.ToArray());
//headerStr = headerStr.TrimStart('\t');
strBuilder
.Append(headerStr)
.Append("\t\n");
}
return strBuilder.ToString();
}
public static string ExportData(DataTable dtData)
{
System.Text.StringBuilder strBuilder = new System.Text.StringBuilder();
if (dtData != null && dtData.Rows.Count > 0)
{
List<string> headers = new List<string>();
foreach (CustomColumn item in dtData.Columns)
{
headers.Add(FormatCSVField(item.Caption));
}
string headerStr = String.Join("", headers.ToArray());
headerStr = headerStr.TrimStart('\t');
strBuilder
.Append(headerStr)
.Append("\t\n");
foreach (DataRow dr in dtData.Rows)
{
List<string> csvRow = new List<string>();
foreach (CustomColumn item in dtData.Columns)
{
if (item.DicData != null && !string.IsNullOrEmpty(dr[item.ColumnName] as string))
{
csvRow.Add(FormatCSVField(GetDicValue(dr[item.ColumnName].ToString(), item.DicData)));
}
else
{
csvRow.Add(FormatCSVField(dr[item.ColumnName].ToTrim()));
}
}
string fieldStr = String.Join("", csvRow.ToArray());
fieldStr = fieldStr.TrimStart('\t');
strBuilder
.Append(fieldStr)
.Append("\t\n");
}
}
return strBuilder.ToString();
}
private static string GetDicValue(string value, List<ComboxData> lstData)
{
string returnValue = string.Empty;
string[] valueArr = value.Split(',');
foreach (string subValue in valueArr)
{
ComboxData comboxData = lstData.SingleOrDefault(d => d.Value == subValue);
if (comboxData != null)
{
returnValue += comboxData.Text + ",";
}
else
{
returnValue += subValue + ",";
}
}
if (!string.IsNullOrEmpty(returnValue))
{
returnValue = returnValue.TrimEnd(',');
}
return returnValue;
}
//public static string ToTrim(this object text)
//{
// if (text == null)
// return "";
// else return text.ToString().Trim();
//}
private static string FormatCSVField(string data)
{
return String.Format("\t{0}", data.Replace("\"", "\t\n"));
}
public static void CreateAndAddTitle(string filePath, string sheetName, List<DataColumnEx> lstDataColumnEx, DataTable dtData)
{
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(true);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
worksheet.Name = sheetName;
int colIndex = 0;
foreach (DataColumnEx col in lstDataColumnEx)
{
colIndex++;
worksheet.Cells[1, colIndex] = col.ChineseName;
}
SetFormat(worksheet, lstDataColumnEx, 2, dtData.Rows.Count);
AddRangeData(worksheet, dtData, 2);
Marshal.ReleaseComObject(worksheet);
excel.DisplayAlerts = false;
workbook.SaveCopyAs(filePath);
workbook.Close(false, null, null);
Marshal.ReleaseComObject(workbook);
excel.Workbooks.Close();
workbook = null;
}
private static void SetFormat(Microsoft.Office.Interop.Excel.Worksheet worksheet, List<DataColumnEx> lstDataColumnEx, int startRow, int rowNumber)
{
int colIndex = 0;
foreach (DataColumnEx col in lstDataColumnEx)
{
colIndex++;
if (col.Type == ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString)
{
Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range(worksheet.Cells[startRow, colIndex], worksheet.Cells[rowNumber + startRow - 1, colIndex]);
range.NumberFormatLocal = "@";
}
}
}
public static void AddRangeData(Microsoft.Office.Interop.Excel.Worksheet worksheet, DataTable dtData, int startRow, bool isAddBK = false)
{
int rowNumber = dtData.Rows.Count;
int columnNumber = dtData.Columns.Count;
object[,] objData = new object[rowNumber, columnNumber];
for (int r = 0; r < rowNumber; r++)
{
for (int c = 0; c < columnNumber; c++)
{
objData[r, c] = dtData.Rows[r][c];
}
}
Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range(worksheet.Cells[startRow, 1], worksheet.Cells[rowNumber + startRow - 1, columnNumber]);
if (isAddBK)
{
range.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
//for (int i = startRow; i < rowNumber + startRow; i++)
//{
// for (int j = 1; j < columnNumber + 1; j++)
// {
// ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, j]).Borders.get_Item(Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeLeft).LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
// ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, j]).Borders.get_Item(Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeRight).LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
// ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[i, j]).Borders.get_Item(Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom).LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
// }
//}
}
range.Value2 = objData;
}
public static void CopfFileAndAddData(string filePath, string fileName, DataTable dtZD, DataTable dtQL, DataTable dtQLR)
{
string sourcePath = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "宗地整理模版", fileName);
string destPath = System.IO.Path.Combine(filePath, fileName);
System.IO.File.Copy(sourcePath, destPath, true);
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(destPath);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
AddRangeData(worksheet, dtZD, 3, true);
Marshal.ReleaseComObject(worksheet);
if (dtQL != null && dtQL.Rows.Count > 0)
{
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[2];
AddRangeData(worksheet, dtQL, 3, true);
Marshal.ReleaseComObject(worksheet);
}
if (dtQLR != null && dtQLR.Rows.Count > 0)
{
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[3];
AddRangeData(worksheet, dtQLR, 3, true);
Marshal.ReleaseComObject(worksheet);
}
excel.DisplayAlerts = false;
workbook.SaveAs(destPath);
workbook.Close(false, null, null);
Marshal.ReleaseComObject(workbook);
excel.Workbooks.Close();
workbook = null;
}
public static bool DataTableToExcel(DataTable dt, string filePath)
{
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
if (app == null)
{
throw new Exception("Excel无法启动");
}
//app.Visible = true;
//Microsoft.Office.Interop.Excel.Workbooks wbs = app.Workbooks;
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(true);
Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];
int cnt = dt.Rows.Count;
int columncnt = dt.Columns.Count;
// *****************获取数据********************
object[,] objData = new System.Object[cnt + 1, columncnt]; // 创建缓存数据
// 获取列标题
for (int i = 0; i < columncnt; i++)
{
objData[0, i] = dt.Columns[i].ColumnName;
}
// 获取具体数据
for (int i = 0; i < cnt; i++)
{
System.Data.DataRow dr = dt.Rows[i];
for (int j = 0; j < columncnt; j++)
{
objData[i + 1, j] = dr[j];
}
}
//********************* 写入Excel******************
Microsoft.Office.Interop.Excel.Range r = ws.get_Range(app.Cells[1, 1], app.Cells[cnt + 1, columncnt]);
r.NumberFormat = "@";
//r = r.get_Resize(cnt+1, columncnt);
r.Value2 = objData;
r.EntireColumn.AutoFit();
//string path = GetAssemblyPath();
//path = path + "日志";
//if (!System.IO.Directory.Exists(path))
//{
// System.IO.Directory.CreateDirectory(path);
//}
//path = path + "\\批量生成不动产单元编号Log";
//if (!System.IO.Directory.Exists(path))
//{
// System.IO.Directory.CreateDirectory(path);
//}
wb.SaveCopyAs(filePath);//path + "\\" + DateTime.Now.ToString("yyyy-MM-dd--hh-mm-ss") + ".xlsx"
app = null;
return true;
}
/// <summary>
/// 获取Assembly的运行路径 \\结束
/// </summary>
/// <returns></returns>
public static string GetAssemblyPath()
{
string sCodeBase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
sCodeBase = sCodeBase.Substring(8, sCodeBase.Length - 8); // 8是 file:// 的长度
string[] arrSection = sCodeBase.Split(new char[] { '/' });
string sDirPath = "";
for (int i = 0; i < arrSection.Length - 1; i++)
{
sDirPath += arrSection[i] + System.IO.Path.DirectorySeparatorChar;
}
return sDirPath;
}
}
}